【问题标题】:WebClient on WP7 - Throw "A request with this method cannot have a request body"WP7 上的 WebClient - 抛出“使用此方法的请求不能有请求正文”
【发布时间】:2012-03-22 14:39:33
【问题描述】:

如果我在 Consoleapp 中执行此代码,它可以正常工作:

        string uriString = "http://url.com/api/v1.0/d/" + Username + "/some?amount=3&offset=0";

        WebClient wc = new WebClient();

        wc.Headers["Content-Type"] = "application/json";
        wc.Headers["Authorization"] = AuthString.Replace("\\", "");

        string responseArrayKvitteringer = wc.DownloadString(uriString);
        Console.WriteLine(responseArrayKvitteringer);

但如果我像这样将代码移动到我的 WP7 项目中:

        string uriString = "http://url.com/api/v1.0/d/" + Username + "/some?amount=3&offset=0";

            WebClient wc = new WebClient();

            wc.Headers["Content-Type"] = "application/json";
            wc.Headers["Authorization"] = AuthString.Replace("\\", "");

            wc.DownloadStringCompleted += new DownloadStringCompletedEventHandler(wc_DownloadStringCompleted);
            wc.DownloadStringAsync(new Uri(uriString));

    void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
    {
        MessageBox.Show(e.Result);
    }

我遇到了异常:使用此方法的请求不能有请求正文。

为什么?

解决办法是去掉Content-type:

   string uriString = "http://url.com/api/v1.0/d/" + Username + "/some?amount=3&offset=0";

            WebClient wc = new WebClient();

            //wc.Headers["Content-Type"] = "application/json";
            wc.Headers["Authorization"] = AuthString.Replace("\\", "");

            wc.DownloadStringCompleted += new DownloadStringCompletedEventHandler(wc_DownloadStringCompleted);
            wc.DownloadStringAsync(new Uri(uriString));

    void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
    {
        MessageBox.Show(e.Result);
    }

【问题讨论】:

  • 出于各种原因以及更多(!),我建议您尝试使用 WebRequest 而不是 WebClient 包装器...... WebClient 确实有一些“技巧”我会导致这个问题,而 WebRequest 可以让您更好地控制 Http 通信!
  • 嗨佩德罗。我已经试过了。它给了我同样的结果。

标签: windows-phone-7 webclient


【解决方案1】:

不知道为什么控制台没有抛出,但你基本上使用了错误的标题。

请求中的Content-Type 表示POST/PUT 数据的内容(HTTP 请求的主体)。你想要的是 Accept 标头。

wc.Headers["Accept"] = "application/json";

http://msdn.microsoft.com/en-us/library/aa287673(v=VS.71).aspx

【讨论】:

  • 另外,虽然不相关,但佩德罗的建议非常好。我做的第一件事是创建自己的 WebClient 包装器 - 使用 WebRequest。它更容易调试,并且让您可以更好地控制您在 UI 中的操作。
  • 你是对的。标头中带有 Accept 的解决方案正在运行。标题中只有 Authorization 的解决方案也有效。谢谢。
猜你喜欢
  • 2022-01-25
  • 1970-01-01
  • 2021-11-26
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-13
  • 2019-11-28
  • 2021-12-31
相关资源
最近更新 更多