Windows Phone アプリケーションがあり、JSON 形式のデータを WCF アプリケーションに投稿しようとしています。接続は確立されていますが、サーバーは次のようなカスタム メッセージを返します。
これは C# コードです。
ReportSightingRequest.Instance.Source = Source.IPhone;
var jsonData = JsonConvert.SerializeObject(ReportSightingRequest.Instance);
var uri = new Uri("urlGoesHere", UriKind.Absolute);
var request = (HttpWebRequest)WebRequest.Create(uri);
request.Method = "POST";
request.ContentType = "application/json";
request.ContentLength = jsonData.Length;
string received;
using (var response = (HttpWebResponse)(await Task<WebResponse>.Factory.FromAsync(request.BeginGetResponse, request.EndGetResponse, null)))
{
using (var responseStream = response.GetResponseStream())
{
using (var sr = new StreamReader(responseStream))
{
received = await sr.ReadToEndAsync();
}
}
}
これは WCF インターフェイスです。
[OperationContract]
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
[Description("Description.")]
Response.Response ReportSighting(ReportSightingRequest sighting);
これは実装です:
public Response ReportSighting(ReportSightingRequest sightingRequest)
{
var response = new Response();
if (sightingRequest == null || sightingRequest.TypeId == null)
{
response.Status = ResponseStatus.InvalidArguments;
response.Message = "Request is null or no type has been supplied.";
return response;
}
...
}
電話から ReportSighting メソッドを呼び出すと、「リクエストが null であるか、タイプが指定されていません」というメッセージが表示されます。奇妙なことは、私がa を送信していて、送信時に WP8 側TypeId
のオブジェクトが null ではないことです。sightingRequest
jsonData にブレークポイントを設定すると、すべてが含まれています。オブジェクトも、WCF アプリケーションのReportSightingRequest
とまったく同じです。ReportSightingRequest
オブジェクトがシリアル化されていないように感じます。それが私が考えることができる唯一のことです。
誰かアイデア/提案はありますか?
アップデート
私は実際にオブジェクトを送信していないことに気付きました。Shawn Kendrot の Answer は理にかなっているように見えますが、彼のコードを統合すると、Not Foundエラーが返されます。
更新 次のコードは、コンソール アプリで機能します。
var jsonData = "a hard coded JSON string here";
var uri = new Uri("a url goes here", UriKind.Absolute);
var webRequest = (HttpWebRequest)WebRequest.Create(uri);
webRequest.Method = "POST";
webRequest.ContentType = "application/json; charset=utf-8";
webRequest.ContentLength = jsonData.Length;
webRequest.BeginGetRequestStream(ar =>
{
try
{
using (var os = webRequest.EndGetRequestStream(ar))
{
var postData = Encoding.UTF8.GetBytes(jsonData);
os.Write(postData, 0, postData.Length);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
webRequest.BeginGetResponse(
ar2 =>
{
try
{
using (var response = webRequest.EndGetResponse(ar2))
using (var reader = new StreamReader(response.GetResponseStream()))
{
var received = reader.ReadToEnd();
//Console.WriteLine(received);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}, null);
}, null);
更新
WP8 のコードを変更して、Shawn Kendrot のソリューションと一致させました。ここで直面している問題は、Not Found
エラー メッセージが表示されることです。
webRequest.BeginGetRequestStream(ar =>
{
try
{
using (var os = webRequest.EndGetRequestStream(ar))
{
var postData = Encoding.UTF8.GetBytes(jsonData);
os.Write(postData, 0, postData.Length);
}
}
catch (Exception ex)
{
MessageBox.Show("Unsuccessful");
}
webRequest.BeginGetResponse(
ar2 =>
{
try
{
using (var response = webRequest.EndGetResponse(ar2))
using (var reader = new StreamReader(response.GetResponseStream()))
{
var received = reader.ReadToEnd();
}
}
catch (Exception ex)
{
MessageBox.Show("Unsuccessful");
}
}, null);
}, null);
私は得る:
{System.UnauthorizedAccessException: クロススレッド アクセスが無効です。MS.Internal.XcpImports.CheckThread() で MS.Internal.XcpImports.MessageBox_ShowCore (文字列 messageBoxText、文字列キャプション、UInt32 型) で System.Windows.MessageBox.ShowCore (文字列 messageBoxText、文字列キャプション、MessageBoxButton ボタン) で System.Windows .MessageBox.Show(String messageBoxText) at Notify.Logic.WebServices.<>c_ DisplayClass2.b _1(IAsyncResult ar2) at System.Net.Browser.ClientHttpWebRequest.<>c_ DisplayClass1d.b _1b(Object state2)}
`MessageBox.Show(ex.Message); を実行しようとすると、
アップデート
MessageBox.Show エラー メッセージの問題を修正しました。
webRequest.Headers
オブジェクトには次のものがあります。
{Content-Type: application/json; charset=utf-8;}