C# 中的 WebClient 默认设置了异常 headers 吗?
Does the WebClient in C# have any unusual headers set by default?
我正在尝试 post 将 WPF 表单发送到我的服务器,但我一直收到 401 未经授权的响应,即使我发送了正确的详细信息。
这是我的 C# 代码
// Send the ComputerSettings to the API
String _Url = this.ApiUrl + "/api/hospitals/settings.xml";
String _Parameters = "";
_Parameters += "access_token=" + Authentication.AccessToken;
_Parameters += "&hospital_id=" + txtHospital.Text;
_Parameters += "&username=" + HttpUtility.UrlEncode(txtUsername.Text);
_Parameters += "&password=" + HttpUtility.UrlEncode(txtPassword.Password);
Debug.WriteLine(_Url + "?" + _Parameters);
WebClient _WebClient = new WebClient();
_WebClient.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
_WebClient.Encoding = System.Text.Encoding.UTF8;
_WebClient.UploadString(_Url, _Parameters);
当我 运行 这个来自 Visual Studio 服务器时 returns 一个 401 未经授权。但是,当我将 url 从 Debug 复制到 REST Chrome 客户端(我使用 DHC 以防万一)然后从那里 POST,请求按预期工作。
我最好的猜测是 Visual Studio 以一种意想不到的方式对 url 参数进行编码。但我无法弄清楚它在做什么是不同的。我也看不到检查响应内容的方法,这将允许我将服务器正在看到的数据转储到响应中并对其进行调试。我尝试过
_ResponseString = _WebClient.UploadString(_Url, _Parameters);
Debug.WriteLine(_ResponseString);
但是在该调试行之前抛出异常,当我检查异常时,响应没有内容。
编辑:
我看到了我的错误,我在我的 REST 客户端中将参数作为查询字符串发送,但作为来自 Visual Studio 的请求参数发送。解决方法(对于此示例)是将 UploadString 调用更改为
_WebClient.UploadString(_Url + "?" + _Parameters, "");
为了让这个问题的解决方案更加明显,我将post我的编辑作为答案
edit: I see my mistake, I'm sending the parameters as a query string
in my REST client, but as request parameters from Visual Studio. The
fix (for this example) is to change the UploadString call to
_WebClient.UploadString(_Url + "?" + _Parameters, "");
instead of
_WebClient.UploadString(_Url, _Parameters);
我正在尝试 post 将 WPF 表单发送到我的服务器,但我一直收到 401 未经授权的响应,即使我发送了正确的详细信息。
这是我的 C# 代码
// Send the ComputerSettings to the API
String _Url = this.ApiUrl + "/api/hospitals/settings.xml";
String _Parameters = "";
_Parameters += "access_token=" + Authentication.AccessToken;
_Parameters += "&hospital_id=" + txtHospital.Text;
_Parameters += "&username=" + HttpUtility.UrlEncode(txtUsername.Text);
_Parameters += "&password=" + HttpUtility.UrlEncode(txtPassword.Password);
Debug.WriteLine(_Url + "?" + _Parameters);
WebClient _WebClient = new WebClient();
_WebClient.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
_WebClient.Encoding = System.Text.Encoding.UTF8;
_WebClient.UploadString(_Url, _Parameters);
当我 运行 这个来自 Visual Studio 服务器时 returns 一个 401 未经授权。但是,当我将 url 从 Debug 复制到 REST Chrome 客户端(我使用 DHC 以防万一)然后从那里 POST,请求按预期工作。
我最好的猜测是 Visual Studio 以一种意想不到的方式对 url 参数进行编码。但我无法弄清楚它在做什么是不同的。我也看不到检查响应内容的方法,这将允许我将服务器正在看到的数据转储到响应中并对其进行调试。我尝试过
_ResponseString = _WebClient.UploadString(_Url, _Parameters);
Debug.WriteLine(_ResponseString);
但是在该调试行之前抛出异常,当我检查异常时,响应没有内容。
编辑: 我看到了我的错误,我在我的 REST 客户端中将参数作为查询字符串发送,但作为来自 Visual Studio 的请求参数发送。解决方法(对于此示例)是将 UploadString 调用更改为
_WebClient.UploadString(_Url + "?" + _Parameters, "");
为了让这个问题的解决方案更加明显,我将post我的编辑作为答案
edit: I see my mistake, I'm sending the parameters as a query string in my REST client, but as request parameters from Visual Studio. The fix (for this example) is to change the UploadString call to
_WebClient.UploadString(_Url + "?" + _Parameters, "");
instead of
_WebClient.UploadString(_Url, _Parameters);