只是想知道是否有人能够回答这个问题?我正在尝试使用WebClient.UploadFile()函数将文件上传到Web服务器。这是按预期工作但是我无法解码响应,因为我认为客户端和服务器之间的一些HTTP通信以内容类型image / jpeg结尾。
var client = new WebClient();
byte[] response = client.UploadFile("http://test.com", "POST", "upload.jpg");
string s = System.Text.Encoding.UTF8.GetString(response).ToString();
Console.Write(s);
HTTP流程如下:
POST / HTTP/1.1 --->
HTTP/1.1 100 Continue <---
HTTP/1.1 302 Found <---
这包含上传内容的网址。
GET /5109799364591616 HTTP/1.1 --->
HTTP/1.1 200 OK <----
程序似乎自动跟随此重定向,这意味着当我返回字节数组时,它实际上包含一个图像文件。
反正有没有在这里归还302? 我的最终目标是返回重定向的URL并将其放入用户的剪贴板中。
答案 0 :(得分:-1)
对于基于http的请求,WebClient在内部使用HttpWebRequest对象实例。 HttpWebRequest允许通过其AllowAutoRedirect属性启用/禁用自动重定向。
要访问并调整AllowAutoRedirect对象的HttpWebRequest属性,您将覆盖WebClient类的受保护方法GetWebRequest。要简单地禁用自动重定向,这就足够了。
如果服务器以302(或类似代码,如303)响应,则可以在响应的位置标题字段中找到重定向URL。幸运的是,WebClient提供了一个公共ResponseHeaders集合,可以轻松访问响应头字段。
如果需要检查服务器发送的实际响应状态代码,则需要访问HttpWebResponse对象生成的HttpWebRequest对象。与访问HttpWebRequest对象的方式类似,WebClient有一个受保护的方法,您可以覆盖该方法以访问HttpWebResponse对象:GetWebResponse(...)。 GetWebResponse有一个用于异步操作的重载。通常,也应该以相同的方式覆盖此重载。
适合您的基本需求的自定义WebClient类的简单实现可能类似于:
public class CustomWebClient : WebClient
{
public HttpStatusCode? ResponseStatusCode { get; set; }
protected override WebRequest GetWebRequest(Uri url)
{
WebRequest req = base.GetWebRequest(url);
if (req is HttpWebRequest)
{
((HttpWebRequest) req).AllowAutoRedirect = false;
}
return req;
}
protected override WebResponse GetWebResponse(WebRequest request)
{
WebResponse resp = base.GetWebResponse(request);
ResponseStatusCode = (resp is HttpWebResponse) ?
((HttpWebResponse) resp).StatusCode
: (HttpStatusCode?) null;
return resp;
}
protected override WebResponse GetWebResponse(WebRequest request, IAsyncResult result)
{
WebResponse resp = base.GetWebResponse(request, result);
ResponseStatusCode = (resp is HttpWebResponse) ?
((HttpWebResponse) resp).StatusCode
: (HttpStatusCode?) null;
return resp;
}
}
请注意,上面实现中的属性 ResponseStatusCode 是可以为空的类型。对于基于http的请求,此属性将保存Web客户端发出的最后一个请求的响应状态代码。对于任何其他类型的请求(例如ftp),此属性的值将设置为 null 。
在您的应用程序中,您可以使用这个简单的CustomWebClient类:
var client = new CustomWebClient();
byte[] response = client.UploadFile("http://test.com", "POST", "upload.jpg");
if (client.ResponseStatusCode == HttpStatusCode.Found)
{
string redirectUri = client.ResponseHeaders[HttpResponseHeader.Location];
... do something with the redirection Uri ...
}