1

Webサイト1からGETリクエストを開始するGETWebサービスを構築しようとしています...そのリクエストをWebサイト2に送信すると、Webサイト2はオブジェクトのリストを送信して応答します。Json.netを使用して、オブジェクトのリストをシリアル化および逆シリアル化します。

この質問の助けを借りてPOSTWebサービスをまとめました。WebServiceASP.NETMVC3送受信

しかし、これまでのところ、その例を新しい要件に適合させることに成功していません。

これが私がウェブサイト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)見つかりません。

どんな助けでも大歓迎です。

4

1 に答える 1

0

問題はルーティングの問題のようです。ここで見つけることができる 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);
        }
    }

私が見る他の問題は、GetScientificFocusAreas()方法にあります。コードの 2 行目で、オブジェクトが JSON に変換されます。これは問題ありませんが、コードの最後の行で json がメソッドに渡されJson()ます。これにより、文字列が Json に再び変換されます。JSON.Net ライブラリを使用する場合は、代わりにContent()メソッドを使用し、コンテンツ タイプをapplication/jsonに設定します。returnJson()

内部コンバーターではなく外部 Json コンバーターを使用する理由は、単純に、内部 json コンバーターにはいくつかの既知の問題があるためです。JSON.Net は何年も前から存在しており、安定しています。

于 2012-07-25T16:22:19.687 に答える