0

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 ではないことです。sightingRequestjsonData にブレークポイントを設定すると、すべてが含まれています。オブジェクトも、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;}

4

1 に答える 1

3

データを送信していないため、sightingRequest は null です。WebRequest を使用してデータを送信するには、BeginGetRequestStream メソッドを使用する必要があります。この方法を使用すると、データをパッケージ化できます。

var webRequest= (HttpWebRequest)WebRequest.Create(uri);
webRequest.Method = "POST";
webRequest.ContentType = "application/json";
webRequest.ContentLength = jsonData.Length;
webRequest.BeginGetRequestStream(ar =>
{
    try
    {
        using (Stream os = webRequest.EndGetRequestStream(ar))
        {
            var postData = Encoding.UTF8.GetBytes(jsonData);
            os.Write(postData, 0, postData.Length);
        }
    }
    catch (Exception ex)
    {
        // Do something, exit out, etc.
    }

    webRequest.BeginGetResponse(
        ar2 =>
        {
            try
            {
                using (var response = webRequest.EndGetResponse(ar2))
                using (var reader = new StreamReader(response.GetResponseStream()))
                {
                    string received = reader.ReadToEnd();
                }
            }
            catch (Exception ex)
            {
                // Do something, exit out, etc.
            }
        }, null);
}, null);
于 2013-09-22T14:52:32.080 に答える