【问题标题】:How do you create a WebException with a custom WebResponse如何使用自定义 WebResponse 创建 WebException
【发布时间】: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? 谢谢, 马特

【问题讨论】:

    标签: .net asp.net-mvc-4 asp.net-web-api httpwebresponse system.net.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,说得好。我已经更新了我的答案以考虑到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2019-11-28
    • 2017-07-28
    • 2012-12-18
    相关资源
    最近更新 更多