MVC 3 GET Web服务和响应



我正在尝试构建一个GET Web服务,该服务将从网站1启动GET请求。。。将该请求发送到网站2,并且网站2将通过发送对象列表来响应。我使用Json.net来序列化和反序列化对象列表。

在这个问题的帮助下,我已经建立了一个POST Web服务。。WebService ASP.NET MVC 3发送和接收

但到目前为止,我还没有成功地将这个例子适应我的新需求。

以下是我目前在网站1.上看到的内容

    public static List<ScientificFocusArea> ScientificFocusAreas()
    {
        string apiURL = "http://localhost:50328/Api/GetAPI";
        //Make the post
        ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, errors) => true;
        //var bytes = Encoding.Default.GetBytes(body);
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(apiURL);
        Stream stream = null;
        try
        {
            request.KeepAlive = false;
            request.ContentType = "application/x-www-form-urlencoded";
            request.Timeout = -1;
            request.Method = "GET";
        }
        finally
        {
            if (stream != null)
            {
                stream.Flush();
                stream.Close();
            }
        }
        List<ScientificFocusArea> listSFA = WebService.GetResponse_ScientificFocusArea(request);
        return listSFA;
    }
    public static List<ScientificFocusArea> GetResponse_ScientificFocusArea(HttpWebRequest request)
    {
        List<ScientificFocusArea> listSFA = new List<ScientificFocusArea>();
        using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
        {
            using (Stream responseStream = response.GetResponseStream())
            {
                if (response.StatusCode != HttpStatusCode.OK && response.StatusCode != HttpStatusCode.Created)
                {
                    throw new HttpException((int)response.StatusCode, response.StatusDescription);
                }
                var end = string.Empty;
                using (StreamReader reader = new StreamReader(responseStream))
                {
                    end = reader.ReadToEnd();
                    reader.Close();
                    listSFA = JsonConvert.DeserializeObject<List<ScientificFocusArea>>(end);
                }
                response.Close();
            }
        }
        return listSFA;
    }

然后在网站2…

public class GetAPIController : Controller
{
    //
    // GET: /Api/GetAPI/
    [AcceptVerbs(HttpVerbs.Get)]
    public ActionResult GetScientificFocusAreas()
    {
        //Get list of SFAs
        List<ScientificFocusArea> ListSFA = CreateList.ScientificFocusArea();
        string json = JsonConvert.SerializeObject(ListSFA, Formatting.Indented);
        //Send the the seralized object.
        return Json(json);
    }
}

此外,在网站2上,我已经为传入请求注册了此路线。。。

        context.MapRoute(
"GetScientificFocusAreas",
"Api/GetAPI/",
new
{
    controller = "GetAPI",
    action = "GetScientificFocusAreas",
    id = UrlParameter.Optional
}

);

我当前收到错误。。远程服务器返回错误:(404)未找到。

任何帮助我都将不胜感激。

这个问题看起来像是路由问题。我将从RouteDebugger开始,它可以在这里找到。该工具可以深入了解您的URL正在访问哪些路由。

我用于HTTPGET的代码与上面的代码有点不同。它包含在下面。

    public T Get<T>(string url)
    {
        try
        {
            HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
            using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
            using (Stream responseStream = response.GetResponseStream())
            {
                if (response.StatusCode != HttpStatusCode.OK && response.StatusCode != HttpStatusCode.Created)
                {
                    throw new HttpException((int)response.StatusCode, response.StatusDescription);
                }
                var end = string.Empty;
                using (StreamReader reader = new StreamReader(responseStream))
                {
                    end = reader.ReadToEnd();
                    reader.Close();
                }
                responseStream.Close();
                response.Close();
                JsonSerializer serializer = new JsonSerializer();
                serializer.Binder = new DefaultSerializationBinder();
                JsonReader jsonReader = new JsonTextReader(new StringReader(end));
                T deserialize = serializer.Deserialize<T>(jsonReader);
                return deserialize;
            }
        }
        catch (Exception ex)
        {
            throw new ApiException(string.Format("An error occured while trying to contact the API. URL: {0}", url), ex);
        }
    }

我看到的另一个问题是GetScientificFocusAreas()方法。在代码的第二行,对象被转换为JSON。这很好,但最后一行代码json被传递到Json()方法中。它将字符串再次转换为Json。使用JSON.Net库时,请使用return中的Content()方法而不是Json(),并将内容类型设置为application/JSON

使用外部Json转换器而不是内部转换器的原因只是内部Json转换器存在一些已知问题。JSON.Net已经存在很多年了,而且非常稳定。

相关内容

  • 没有找到相关文章

最新更新