WebException(状态:协议错误)

时间:2016-09-26 13:42:24

标签: c# http http-headers

我使用WebClient类在C#中调用url。以下是代码: -

    public string SendWebRequest(string requestUrl)
    {
        using (var client = new WebClient())
        {
            string responseText = client.DownloadString(requestUrl);
            return responseText;
        } 
    }

此代码失败,并显示以下异常详细信息: -

System.Net.WebException: The remote server returned an error: (1201).
   at System.Net.WebClient.DownloadDataInternal(Uri address, WebRequest& request)
   at System.Net.WebClient.DownloadString(Uri address)
   at System.Net.WebClient.DownloadString(String address)

Exception Status: ProtocolError

网址正确点击服务器。服务器上预期的操作(更新数据库)正确发生。服务器正确发送响应。 WebClient未处理回复。

我也尝试使用HttpWebRequest课程但没有成功。

最初,请求时存在类似问题。当我使用以下内容修改app.config时,它已得到解决: -

    <settings>
        <httpWebRequest useUnsafeHeaderParsing = "true"/>
    </settings>

我无法在此论坛上发布网址,无论如何都无法在网络外访问。

如果我在浏览器地址栏中复制相同的网址,它就可以正常运行并返回预期的响应。

那么Windows应用程序会出现什么问题呢?

修改1

我实施了回答的建议。我还在this问题的已接受答案中实施了建议。现在,我的功能如下: -

    public string SendWebRequest(string requestUrl)
    {
        using (var client = new WebClient())
        {
            client.Headers.Add("Accept", "text/plain");
            client.Headers.Add("Accept-Language", "en-US");
            client.Headers.Add("User-Agent", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)");
            client.Headers["Content-Type"] = "text/plain;charset=UTF-8";
            string responseText = client.DownloadString(requestUrl);
            return responseText;
        } 
    }

它仍然无法解决问题。响应现在是空白字符串(“”)而不是“成功”。这不是来自已确认的服务器的错误。

如果删除app.config中的配置,则会抛出其他异常。

System.Net.WebException: The server committed a protocol violation. Section=ResponseStatusLine
   at System.Net.WebClient.DownloadDataInternal(Uri address, WebRequest& request)
   at System.Net.WebClient.DownloadString(Uri address)
   at System.Net.WebClient.DownloadString(String address)

2 个答案:

答案 0 :(得分:3)

您的服务器正在返回HTTP 1201,而不是standard status code

WebClient在面对非成功的状态代码(或在您的情况下是无法识别的状态代码)时会因异常而失败。

如果可以的话,我鼓励你使用新的HttpClient课程:

public async Task<string> SendWebRequest(string requestUrl)
{
    using (HttpClient client = new HttpClient())
    using (HttpResponseMessage response = await client.GetAsync(requestUrl))
         return await response.Content.ReadAsStringAsync();
}

如果你必须同步:

public string SendWebRequest(string requestUrl)
{
    using (HttpClient client = new HttpClient())
    using (HttpResponseMessage response = client.GetAsync(requestUrl).GetAwaiter().GetResult())
         return response.Content.ReadAsStringAsync().GetAwaiter().GetResult();
}

答案 1 :(得分:2)

尝试更改网络客户端的标题。您的响应似乎与标头类型不兼容。 我建议您在客户端client.Headers.Add("Accept", "application/json");添加一个Accept标头,假设您正在等待Json。