我使用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)
答案 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。