在Windows Phone上使用C#格式的WebClient发布数据对我不起作用

在Windows Phone上使用C#格式的WebClient发布数据对我不起作用,c#,silverlight,windows-phone-7.1,C#,Silverlight,Windows Phone 7.1,当我执行上述代码时,它与第一个被注释掉的URL一起工作。然而,当我执行第二个代码时,我得到了一般的“NotFound”错误。没有什么是张贴在小提琴。所以我把有问题的url粘贴到“Composer”中。当我执行请求时,它按预期工作 我做错了什么?为什么我不能调用该特定端点?它用小提琴演奏。它在JQuery中工作。我就是不能让它从SL为WP工作 感谢您提供的任何见解。我建议尝试对参数进行编码 // string url = "http://localhost:19315/test/postWithP

当我执行上述代码时,它与第一个被注释掉的URL一起工作。然而,当我执行第二个代码时,我得到了一般的“NotFound”错误。没有什么是张贴在小提琴。所以我把有问题的url粘贴到“Composer”中。当我执行请求时,它按预期工作

我做错了什么?为什么我不能调用该特定端点?它用小提琴演奏。它在JQuery中工作。我就是不能让它从SL为WP工作


感谢您提供的任何见解。

我建议尝试对参数进行编码

// 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);
}
另外,一般来说:您在这里不是执行POST请求,而是执行GET请求。内容长度不应设置为URL的长度,而应设置为帖子数据的长度(在本例中为string.Empty)

实际上,您可以调用DownloadStringAsync(url)来实现同样的功能,因为您不会发布任何内容

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请求,您可以尝试以下操作:

WebClient wc = new WebClient();
wc.DownloadStringAsync(new Uri(url));
此外,MessageBox可能会抛出InvalidOperationException(交叉线程)。如果确实如此,则按如下方式调用它们:

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);
}

我建议尝试对论点进行编码

// 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);
}
另外,一般来说:您在这里不是执行POST请求,而是执行GET请求。内容长度不应设置为URL的长度,而应设置为帖子数据的长度(在本例中为string.Empty)

实际上,您可以调用DownloadStringAsync(url)来实现同样的功能,因为您不会发布任何内容

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请求,您可以尝试以下操作:

WebClient wc = new WebClient();
wc.DownloadStringAsync(new Uri(url));
此外,MessageBox可能会抛出InvalidOperationException(交叉线程)。如果确实如此,则按如下方式调用它们:

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);
}

假设您已经在void函数中编写了上述代码。您正在调用的函数,请告诉我您将如何确保名为“postWithParamsClient_UploadStringCompleted”的函数将执行并从服务器返回响应。我希望你明白我的意思。我再次简要解释。假设您希望在发送成功的POST请求后保存服务器响应。正如我提到的事件名称,何时执行,我们可以将响应保存在我的全局变量中?在使用您的方法时,我遇到了这个问题。假设您在一个void函数中编写了上述代码。您正在调用的函数,请告诉我您将如何确保名为“postWithParamsClient_UploadStringCompleted”的函数将执行并从服务器返回响应。我希望你明白我的意思。我再次简要解释。假设您希望在发送成功的POST请求后保存服务器响应。正如我提到的事件名称,何时执行,我们可以将响应保存在我的全局变量中?在使用您的方法时,我面临着这个问题。