Asp.net mvc 3 MVC 3获取Web服务和响应

Asp.net mvc 3 MVC 3获取Web服务和响应,asp.net-mvc-3,json.net,Asp.net Mvc 3,Json.net,我正在尝试构建一个GET Web服务,它将从网站1启动一个GET请求…将该请求发送到网站2,网站2将通过发送一个对象列表来响应。我使用Json.net对对象列表进行序列化和反序列化 在这个问题的帮助下,我创建了一个POST Web服务 但到目前为止,我还没有成功地将这个例子应用到我的新需求中 以下是我到目前为止从网站1得到的信息 public static List<ScientificFocusArea> ScientificFocusAreas() {

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

在这个问题的帮助下,我创建了一个POST Web服务

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

以下是我到目前为止从网站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;
    }
))

我现在得到了错误。。远程服务器返回错误:(404)未找到


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

这个问题似乎是一个路由问题。我将从可以找到的RouteDebugger开始。此工具可帮助您了解URL所点击的路由

我用于HTTP GET的代码与上面的代码略有不同。它包括在下面

    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);
        }
    }
publictget(字符串url)
{
尝试
{
HttpWebRequest-request=WebRequest.Create(url)为HttpWebRequest;
使用(HttpWebResponse=request.GetResponse()作为HttpWebResponse)
使用(Stream responseStream=response.GetResponseStream())
{
if(response.StatusCode!=HttpStatusCode.OK&&response.StatusCode!=HttpStatusCode.Created)
{
抛出新的HttpException((int)response.StatusCode,response.StatusDescription);
}
var end=string.Empty;
使用(StreamReader=新StreamReader(responseStream))
{
end=reader.ReadToEnd();
reader.Close();
}
responseStream.Close();
response.Close();
JsonSerializer serializer=新的JsonSerializer();
serializer.Binder=新的DefaultSerializationBinder();
JsonReader-JsonReader=newjsontextreader(newstringreader(end));
T deserialize=serializer.deserialize(jsonReader);
返回反序列化;
}
}
捕获(例外情况除外)
{
抛出新的ApiException(string.Format(“试图联系API时出错。URL:{0}”,URL),ex);
}
}
我看到的另一个问题是
GetScientificFocusAreas()
方法。在代码的第二行,对象被转换为JSON。这很好,但是json的最后一行代码被传递到
json()
方法中。再次将字符串转换为Json。使用JSON.Net库时,请使用
return
中的
Content()
方法,而不是
JSON()
,并将内容类型设置为application/JSON


使用外部Json转换器而不是内部转换器的理由很简单,内部Json转换器存在一些已知问题。JSON.Net已经存在多年了,而且是可靠的

我正在尝试实现您的建议,但此行出现错误…serializer.Binder=new DefaultSerializationBinder();我是否缺少命名空间或类?使用系统;使用System.Collections.Generic;使用System.Web;使用System.Web.Routing;使用System.Web.Mvc;使用System.IO;使用系统集合;Net系统;使用系统文本;使用Newtonsoft.Json;忽略我最后的评论,恰克,我能让它工作。serializer.Binder=新的DefaultSerializationBinder();非常感谢你的帮助,恰克!
        context.MapRoute(
"GetScientificFocusAreas",
"Api/GetAPI/",
new
{
    controller = "GetAPI",
    action = "GetScientificFocusAreas",
    id = UrlParameter.Optional
}
    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);
        }
    }