0

我有一个奇怪的问题发生。我有一些代码必须对客户端的服务器进行 http 发布。他们的帖子将内容返回给我,我需要向我的用户展示这些内容。如果你有问题,我想捕获错误并注入我自己的内容,让用户知道有问题。

这是我用于执行 http 帖子的静态助手类。

public static class HttpPostHelper
{
    public static string Post(string url, NameValueCollection values)
    {
        StringBuilder dataBuilder = new StringBuilder();

        foreach (var key in values.AllKeys)
        {
            EncodeAndAddItem(ref dataBuilder, key, values[key]);
        }

        Uri uri = new Uri(url);
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";
        request.ContentLength = dataBuilder.Length;
        using (Stream writeStream = request.GetRequestStream())
        {
            UTF8Encoding encoding = new UTF8Encoding();
            byte[] bytes = encoding.GetBytes(dataBuilder.ToString());
            writeStream.Write(bytes, 0, bytes.Length);
        }

        string result = String.Empty;

        using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
        {
            using (Stream responseStream = response.GetResponseStream())
            {
                using (StreamReader readStream = new StreamReader(responseStream, Encoding.UTF8))
                {
                    result = readStream.ReadToEnd();
                }
            }
        }

        return result;
    }

    private static void EncodeAndAddItem(ref StringBuilder baseRequest, string key, string dataItem)
    {
        if (baseRequest == null)
        {
            baseRequest = new StringBuilder();
        }
        if (baseRequest.Length != 0)
        {
            baseRequest.Append("&");
        }

        baseRequest.Append(key);
        baseRequest.Append("=");
        baseRequest.Append(System.Web.HttpUtility.UrlEncode(dataItem));
    }
}

这是我发布并返回内容的代码。

private string GetReturnContent(string callback, NameValueCollection data, LogRequest request)
{
    string content = String.Empty;

    try
    {
        
        content = HttpPostHelper.Post(callback, data);
        
        request.Message = String.Format("Content Retrieved from Callback: {0}", content);

        logService.Debug(request);
    }
    catch (System.Net.WebException ex)
    {
        var response = ex.Response as HttpWebResponse;

        if (response != null)
        {
            if ((int)response.StatusCode == 403)
            {
                content = String.Format("The url {0} returned access denied (403).", callback);
                request.Message = content;
                logService.Warn(request);
            }
            else if ((int)response.StatusCode == 404)
            {
                content = String.Format("The url {0} returned page not found (404).", callback);
                request.Message = content;
                logService.Warn(request);
            }
            else if ((int)response.StatusCode == 405)
            {
                content = String.Format("The url {0} returned 405 error.  Please ensure the url is configured to accept http POST requests", callback);
                request.Message = content;
                logService.Warn(request);
            }
            else if ((int)response.StatusCode == 500)
            {
                content = String.Format("The url {0} returned a server error (500).", callback);
                request.Message = content;
                logService.Warn(request);
            }
            else
            {
                exceptionHandler.HandleError(ex);

                content = String.Format("The url {0} returned an error: {1}", callback, ex.Message);
                request.Message = content;
                logService.Error(request);
            }
        }
        else
        {
            exceptionHandler.HandleError(ex);

            content = String.Format("The url {0} returned an error: {1}", callback, ex.Message);
            request.Message = content;
            logService.Error(request);
        }
    }

    return content;
}

问题是无论如何,我总是收到一个服务器错误报告给我(通过电子邮件报告处理程序,但那是另一回事。我已经捕获了异常,我不会重新抛出它,但我仍然得到错误报告。

例外:

System.Net.WebException:无法连接到远程服务器

内部异常消息:

System.Net.Sockets.SocketException :连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立连接失败,因为连接的主机没有响应[编辑]

堆栈跟踪指向这一行作为我的 PostHelper 中的罪魁祸首

using (Stream writeStream = request.GetRequestStream())

在 System.Net.HttpWebRequest.GetRequestStream(TransportContext& context) 在 System.Net.HttpWebRequest.GetRequestStream()

4

1 回答 1

2

您收到套接字错误。此错误发生在发送 HTTP 流量之前(因此,没有状态代码)。

此块将被执行(因此您的错误电子邮件通知):

exceptionHandler.HandleError(ex);

content = String.Format("The url {0} returned an error: {1}", callback, ex.Message);
request.Message = content;
logService.Error(request);
于 2012-07-09T17:34:45.747 回答