1

次のような C# で Web サービスを作成しました。

    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public string UpdateHeatCallJSON(string json)
    {
        HeatItem item = JsonConvert.DeserializeObject<HeatItem>(json);
        UpdateHeatCall(item);
        HeatItemResponse response = new HeatItemResponse();
        //... more code
        return JsonConvert.SerializeObject(response);
    }

私は基本的に、引数として渡したいオブジェクト HeatItem を持っています。

私は現在、C# コンソール アプリケーションで (テスト用に) Web サービスを使用しており、正しい形式を見つけるのに苦労しています。これは私の呼びかけです:

   static void UpdateHeatItemJSON()
    {
        // corrected to WebRequest from HttpWebRequest
        WebRequest request = WebRequest.Create(requestServer + "/UpdateHeatCallJSON");

        request.Method = "POST";
        request.ContentType = "application/json; charset=utf-8";
        string postData = "";
        postData = @"{'json':'{""BusinessPartner"":""00000000-0000-0000-0000-000000000000"",""CaseNumber"":4,""CaseDescription"":""first case"",""CaseType"":"""",""CaseSeverity"":"""",""DueDate"":""0001-01-01T00:00:00"",""AssignmentNumber"":5,""AssignmentDescription"":"""",""AssignmentCreation"":""0001-01-01T00:00:00"",""AssignmentTime"":""0001-01-01T00:00:00"",""ChangeDate"":""0001-01-01T00:00:00"",""ChangeTime"":""0001-01-01T00:00:00"",""Group"":"""",""SubGroup"":"""",""Module"":"""",""AssignmentStatus"":"""",""KPIChallenge"":false,""KPI1Status"":"""",""KPI1User"":"""",""KPI1Date"":""0001-01-01T00:00:00"",""KPI1Time"":""0001-01-01T00:00:00"",""KPI2Status"":"""",""KPI2User"":"""",""KPI2Date"":""0001-01-01T00:00:00"",""KPI2Time"":""0001-01-01T00:00:00"",""SessionID"":null}'}";

        System.Diagnostics.Debug.Print(postData);

        //get a reference to the request-stream, and write the postData to it
        using (Stream s = request.GetRequestStream())
        {
            using (StreamWriter sw = new StreamWriter(s))
                sw.Write(postData);
        }

        //get response-stream, and use a streamReader to read the content
        using (Stream s = request.GetResponse().GetResponseStream())
        {
            using (StreamReader sr = new StreamReader(s))
            {
                string jsonData = sr.ReadToEnd();
                JObject jObject = JObject.Parse(jsonData);
                JToken jHeatItem = jObject["HeatItem"];
            }
        }
    }

上記の postData を見ると、上記のように json 文字列をフォーマットすることはできますが、http://jsonlint.com/ で文字列を検証すると検証に失敗します。次のように検証済みの json 文字列を渡すと:

{ "json": { "BusinessPartner": "00000000-0000-0000-0000-000000000000", "CaseNumber": 4, "CaseDescription": "最初のケース", "CaseType": "", "CaseSeverity": "" , "DueDate": "0001-01-01T00:00:00", "AssignmentNumber": 5, "AssignmentDescription": "", "AssignmentCreation": "0001-01-01T00:00:00", "AssignmentTime": "0001-01-01T00:00:00", "ChangeDate": "0001-01-01T00:00:00", "ChangeTime": "0001-01-01T00:00:00", "グループ": "" , "サブグループ": "", "モジュール": "","AssignmentStatus": ""、"KPIChallenge": false、"KPI1Status": ""、"KPI1User": ""、"KPI1Date": "0001-01-01T00:00:00"、"KPI1Time": "0001- 01-01T00:00:00"、"KPI2Status": ""、"KPI2User": ""、"KPI2Date": "0001-01-01T00:00:00"、"KPI2Time": "0001-01-01T00: 00:00"、"SessionID": null } }0001-01-01T00:00:00", "KPI2Status": "", "KPI2User": "", "KPI2Date": "0001-01-01T00:00:00", "KPI2Time": "0001-01- 01T00:00:00"、"SessionID": null } }0001-01-01T00:00:00", "KPI2Status": "", "KPI2User": "", "KPI2Date": "0001-01-01T00:00:00", "KPI2Time": "0001-01- 01T00:00:00"、"SessionID": null } }

Web サービスは 500 Internal Server Error を返します。これは、渡された引数が気に入らないためだと思います。

また、応答 (実際の例) を見ると、返された json には 3 つのバックスラッシュが含まれています \\ 引用符をエスケープすると思います。これにより、この呼び出しが行われます

                JObject jObject = JObject.Parse(jsonData);
                JToken jHeatItem = jObject["HeatItem"];

失敗する。理由はありますか?

ありがとうトーマス

4

2 に答える 2

0

リクエストを設定するときに、 を追加しましrequest.Accept = "application/json; charset=utf-8";た。ScriptServiceサービスが属性で装飾されていることを確認してください。例えば、

[System.Web.Script.Services.ScriptService]    
public class Service1 : System.Web.Services.WebService

投稿データをフォーマットするとき、このスタイルがうまくいきました:

@"{""json"":'{""test"": ""value""}'}";

重要なことは、最初のコロンの後に JSON を一重引用符で囲むことです。

不要なバックスラッシュ文字に関しては、このリンクhttp://encosia.com/asp-net-web-services-mistake-manual-json-serialization/を確認してください。基本的には、文字列ではなく、サービスからオブジェクトを返すということです。同じことが、オブジェクトをサービスに渡す場合にも当てはまります。

于 2012-10-08T03:52:28.407 に答える
0

すべてがとても簡単になった今、これに多くの時間を無駄にする馬鹿のように感じます. asp.netに任せてください。この投稿の手順に従い、すべてが完全に機能しています

http://encosia.com/asp-net-web-services-mistake-manual-json-serialization/

于 2012-10-08T11:32:15.327 に答える