次のような 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"];
失敗する。理由はありますか?
ありがとうトーマス