如何使用自定义 WebResponse 创建 WebException
Posted
技术标签:
【中文标题】如何使用自定义 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 创建 WebException的主要内容,如果未能解决你的问题,请参考以下文章
使用 HttpWebRequest,将文件上传到 SharePoint 时,WebResponse 是未编译的 aspx 页面
如果从 WebClient 提出,是不是应该在 WebException 中处理 WebResponse 引用?
在 Mono 上使用自定义 SSL 客户端证书 System.Net.HttpClient
csharp 每个实例的ScriptableObject实例的自定义图标;来自https://www.reddit.com/r/Unity3D/comments/3yq4we/custom_icon_