1
// string url = "http://localhost:19315/test/postWithParamters?param1=1&param2=2";
string url = "http://m.mydomain.com/1.0/services/logException?p1=WindowsPhone&p2=a&p3=b&p4=2012-05-01T14:57:32.8375298-04:00&p5=someuser&p6=test&p7=info&p8=data";

WebClient postWithParamsClient = new WebClient();
postWithParamsClient.UploadStringCompleted += new UploadStringCompletedEventHandler(postWithParamsClient_UploadStringCompleted);

Uri address = new Uri(url, UriKind.Absolute);
postWithParamsClient.Headers["Content-Length"] = url.Length.ToString();
postWithParamsClient.UploadStringAsync(address, "POST", string.Empty);

private void postWithParamsClient_UploadStringCompleted(object sender, UploadStringCompletedEventArgs e)
{
  if (e.Error == null)
    MessageBox.Show("WebClient: " + e.Result);
  else
    MessageBox.Show("WebClient: " + e.Error.Message);
}

上記のコードを実行すると、コメント アウトされた最初の URL で動作します。ただし、2 番目のコードを実行すると、一般的な「NotFound」エラーが発生します。Fiddler には何も投稿されません。そこで、問題の URL を取得して「Composer」に貼り付けました。リクエストを実行すると、期待どおりに機能します。

私は何を間違っていますか?その特定のエンドポイントに電話をかけることができないのはなぜですか? フィドラーで動作します。JQueryから動作します。SL for WPから動作させることができません。

洞察をありがとう。

4

1 に答える 1

1

引数をエンコードすることをお勧めします。

string url = string.Format("http://m.mydomain.com/1.0/services/logException?p1=WindowsPhone&p2=a&p3=b&p4={0}&p5=someuser&p6=test&p7=info&p8=data", HttpUtility.UrlEncode("2012-05-01T14:57:32.8375298-04:00"));

また、一般に、ここでは POST リクエストではなく、GET リクエストを実行します。Content-Length は、URL の長さではなく、POST データ (この場合は string.Empty) の長さに設定する必要があります。

実際には、 DownloadStringAsync(url) を呼び出すだけで同じことを達成できます。とにかく何も投稿していないからです。

WebClient wc = new WebClient();
wc.DownloadStringAsync(new Uri(url));

POST リクエストを達成するには、これを試すことができます。

string url = "http://m.mydomain.com/1.0/services/logException";
string postdata = string.Format("p1=WindowsPhone&p2=a&p3=b&p4={0}&p5=someuser&p6=test&p7=info&p8=data", HttpUtility.UrlEncode("2012-05-01T14:57:32.8375298-04:00"));

WebClient postWithParamsClient = new WebClient();
postWithParamsClient.UploadStringCompleted += new UploadStringCompletedEventHandler(postWithParamsClient_UploadStringCompleted);

postWithParamsClient.Headers["Content-Length"] = postdata.Length.ToString();
postWithParamsClient.UploadStringAsync(new Uri(url), "POST", postdata);

private void postWithParamsClient_UploadStringCompleted(object sender, UploadStringCompletedEventArgs e)
{
  if (e.Error == null)
    MessageBox.Show("WebClient: " + e.Result);
  else
    MessageBox.Show("WebClient: " + e.Error.Message);
}

また、MessageBox はおそらく InvalidOperationException (クロス スレッド) をスローします。その場合は、次のように呼び出します。

private void postWithParamsClient_UploadStringCompleted(object sender, UploadStringCompletedEventArgs e)
{
  Dispatcher.BeginInvoke(() => {
    if (e.Error == null)
      MessageBox.Show("WebClient: " + e.Result);
    else
      MessageBox.Show("WebClient: " + e.Error.Message);
  });
}
于 2012-06-07T20:01:28.113 に答える