2015-06-19 52 views
0

想知道是否有人能够回答这个问题?我正尝试使用WebClient.UploadFile()函数将文件上传到Web服务器。这是按预期工作,但我无法解码响应,因为我相信是客户端和服务器之间的一种HTTP通信,以content-Type image/jpeg结尾。如何返回WebClient()UploadFile()302响应

的HTTP流程如下:

POST/HTTP/1.1 ---> 
HTTP/1.1 100 Continue <--- 
HTTP/1.1 302 Found <--- 

这包含用于上载的内容的URL。

GET /5109799364591616 HTTP/1.1 ---> 
HTTP/1.1 200 OK <---- 

看来程序会自动跟随此重定向,这意味着当我返回字节数组时,它实际上包含一个图像文件。

有没有办法在这里返回302? 我的最终目标是返回重定向的URL并将其放入用户的剪贴板。

回答

0

对于基于http的请求,WebClient在内部使用HttpWebRequest对象实例。 HttpWebRequest允许通过其AllowAutoRedirect属性启用/禁用自动重定向。

要访问并调整HttpWebRequest对象的AllowAutoRedirect属性,您可以覆盖WebClient类的受保护方法GetWebRequest。要简单地禁用自动重定向,这就足够了。

如果服务器使用302(或类似的代码,如303)进行响应,则可以在响应的位置标题字段中找到重定向URL。幸运的是,WebClient提供了一个公开的ResponseHeaders集合以方便访问响应头字段。

如果您需要检查服务器发送的实际响应状态代码,则需要访问由HttpWebRequest对象生成的HttpWebResponse对象。以类似的方式访问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 ... 
} 
+0

这完美的作品。感谢您的快速响应。 –