关于webResponse类使用的时候超时问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于webResponse类使用的时候超时问题相关的知识,希望对你有一定的参考价值。

/string strFilePath = "http://172.17.1.51/E/record/2010-11-25/20101125203226_4_i.wav"; string strFilePath =ylj; System.Net.WebRequest wreq = System.Net.WebRequest.Create(strFilePath); System.Net.WebResponse wresp = (System.Net.WebResponse)wreq.GetResponse(); System.IO.Stream s = wresp.GetResponseStream(); 我用这段的时候,就提示超时,我这个是用于在业务服务器IIS上部署网站,然后上传附件到另一台文件服务器上,上面有一个共享文件夹,在业务服务器上能访问到这个文件服务器共享的文件夹,我在业务服务器上也部署了一个虚拟目录指向了文件服务器的共享文件夹,

当我提交的时候,等很长时间,然后就提示操作超时,哪位高手大哥能帮忙解决下,弄一天了 没解决

参考技术A

把我封装的方法给你吧:

    static string GetPage(string url, string param, string proxy, string method)
    
        if (method != "POST" && !string.IsNullOrEmpty(param))
            if(url.IndexOf('?') > 0)
                url += "&" + param;
            else
                url += "?" + param;
        
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        request.Headers.Add(HttpRequestHeader.CacheControl, "no-cache");
        request.Headers.Add("Accept-Charset", "utf-8");
        request.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0;)";
        request.AllowAutoRedirect = true; //出现301或302之类的转向时,是否要转向
        if (!string.IsNullOrEmpty(proxy))
        
            string[] tmp = proxy.Split(new[]  ':' , StringSplitOptions.RemoveEmptyEntries);
            int port = 80;
            if (tmp.Length >= 2)
                if (!int.TryParse(tmp[1], out port))
                    port = 80;
            request.Proxy = new WebProxy(tmp[0], port);
        
        request.Method = method;//"GET";//"POST";
        request.ContentType = "application/x-www-form-urlencoded";
        // 设置提交的数据
        if (method == "POST" && !string.IsNullOrEmpty(param))
        
            // 把数据转换为字节数组
            byte[] l_data = Encoding.UTF8.GetBytes(param);
            request.ContentLength = l_data.Length;
            // 必须先设置ContentLength,才能打开GetRequestStream
            // ContentLength设置后,reqStream.Close前必须写入相同字节的数据,否则Request会被取消
            using (Stream newStream = request.GetRequestStream())
            
                newStream.Write(l_data, 0, l_data.Length);
                newStream.Close();
            
        
        using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
        using (Stream stream = response.GetResponseStream())
        
            using (var sr = new StreamReader(stream, Encoding.UTF8))
            
                return sr.ReadToEnd();
            
        
    

参考技术B 试试设置ConentLength 参考技术C 你 判断你访问的网址手动访问下是不是可以访问?

如何使用自定义 WebResponse 创建 WebException

【中文标题】如何使用自定义 WebResponse 创建 WebException【英文标题】:How do you create a WebException with a custom WebResponse 【发布时间】:2013-02-20 15:31:59 【问题描述】:

我使用 MVC4 Web API 创建了一个 RESTful Web 服务。如果出现问题,我将抛出 WebException。

throw new WebException("Account not found");

这是处理异常的客户端代码:

private void webClientPost_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
    
        try
        
            if (e.Error == null)
            
                // Display result
                textBoxResult.Text = e.Result;
            
            else
            
                // Display status code
                if (e.Error is WebException)
                
                    StringBuilder displayMessage = new StringBuilder();

                    WebException we = (WebException)e.Error;
                    HttpWebResponse webResponse = (System.Net.HttpWebResponse)we.Response;

                    displayMessage.AppendLine(webResponse.StatusDescription);

                    // Gets the stream associated with the response.
                    Stream receiveStream = webResponse.GetResponseStream();
                    Encoding encode = System.Text.Encoding.GetEncoding("utf-8");

                    // Pipes the stream to a higher level stream reader with the required encoding format. 
                    StreamReader readStream = new StreamReader(receiveStream, encode);

                    displayMessage.Append(readStream.ReadToEnd());

                    readStream.Close();

                    textBoxResult.Text = displayMessage.ToString();
                
            
        
        catch (Exception ex)
        
            textBoxResult.Text = ex.Message;
        
    

如您所见,客户端代码正在显示 WebException 中包含的 HttpWebResponse。但是显示的是:

Internal Server Error "Message":"An error has occurred."

这不是我的错误信息 :-( 所以我想我会使用 Mircosoft MSDN WebException 4th Constructor 指定的 WebException 的替代构造函数

在 MSDN 示例中,他们通过以下方式创建 WebResponse:

MemoryStream memoryStream = new MemoryStream(recvBytes);
getStream = (Stream) memoryStream;

// Create a 'WebResponse' object
WebResponse myWebResponse = (WebResponse) new HttpConnect(getStream);
Exception myException = new Exception("File Not found");

// Throw the 'WebException' object with a message string, message status,InnerException and WebResponse 
throw new WebException("The Requested page is not found.", myException, WebExceptionStatus.ProtocolError, myWebResponse);

但是 .Net Framework 中不存在 HttpConnect :-(.

有谁知道如何使用特定的 WebResponse 创建 WebException? 谢谢, 马特

【问题讨论】:

【参考方案1】:

如果出现问题,我会抛出 WebException

哦,不,不要。如果您的 Web API 出现问题,请设置相应的响应状态代码。

例如:

public HttpResponseMessage Get(int id)

    var model = this.repository.Get(id);
    if (model == null)
    
        return Request.CreateErrorResponse(
            HttpStatusCode.NotFound, 
            string.Format("Sorry but we couldn't find a resource with id=0", id)
        );
    

    return Request.CreateResponse(HttpStatusCode.OK, model);

然后在客户端:

using (var client = new WebClient())

    try
    
        string result = client.DownloadString("http://example.com/api/someresources/123");
    
    catch (WebException ex)
    
        // get the status code:
        var response = (HttpWebResponse)ex.Response;
        var statusCode = response.StatusCode;
        // you could also read the response stream:
        using (var reader = new StreamReader(response.GetResponseStream()))
        
            // now you could read the body
            string body = reader.ReadToEnd();
        
    

【讨论】:

您确实想使用 CreateErrorResponse 而不是 CreateResponse 以与 Web API 的其他错误消息保持一致。 @YoussefMoussaoui,说得好。我已经更新了我的答案以考虑到这一点。

以上是关于关于webResponse类使用的时候超时问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 HttpWebRequest,将文件上传到 SharePoint 时,WebResponse 是未编译的 aspx 页面

关于类定义的问题

如果从 WebClient 提出,是不是应该在 WebException 中处理 WebResponse 引用?

关于python中re模块split方法的使用

Python3中urllib详细使用方法(header,代理,超时,认证,异常处理) 转载

SendRequest 有时候会出现超时现象怎么解决