如何返回WebClient()UploadFile()302响应

时间:2015-06-19 17:04:07

标签: c# .net webclient

只是想知道是否有人能够回答这个问题?我正在尝试使用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并将其放入用户的剪贴板中。

1 个答案:

答案 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 ...
}