c#-在操作方法内抛出HttpResponseException时处理HttpResponseMessage及其内容
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c#-在操作方法内抛出HttpResponseException时处理HttpResponseMessage及其内容,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1799字,纯文字阅读大概需要3分钟。
内容图文
![c#-在操作方法内抛出HttpResponseException时处理HttpResponseMessage及其内容](/upload/InfoBanner/zyjiaocheng/686/81169ec9cf1f4693a6c4daf0fecbcd72.jpg)
我的问题的来源是以下代码,这是Microsoft documentation中包含的代码片段的一部分,用于asp.net Web api中的异常处理:
var resp = new HttpResponseMessage(HttpStatusCode.NotFound)
{
Content = new StringContent(string.Format("No product with ID = {0}", id)),
ReasonPhrase = "Product ID Not Found"
};
throw new HttpResponseException(resp);
HttpResponseMessage和StringContent都实现IDisposable接口,但是上述代码中没有人调用方法IDisposable.Dispose.
这有问题吗?不处理这些物体有任何副作用吗?
根据this article,可能的解决方案是将上面的代码更改为以下代码:
var content = new StringContent(string.Format("No product with ID = {0}", id));
var resp = new HttpResponseMessage(HttpStatusCode.NotFound)
{
Content = content,
ReasonPhrase = "Product ID Not Found"
};
this.Request.RegisterForDispose(content);
this.Request.RegisterForDispose(resp);
throw new HttpResponseException(resp);
这真的必要吗,还是有可能避免这种情况(根据Microsoft文档中显示的内容)?
解决方法:
由HttpResponseException包装的响应将由asp.net框架处理,就像您从操作返回的任何其他响应一样.您可以通过创建虚拟响应消息来轻松地测试自己:
class DummyResponse : HttpResponseMessage {
public DummyResponse(HttpStatusCode statusCode) : base(statusCode) {
}
protected override void Dispose(bool disposing) {
Console.WriteLine("dispose called");
base.Dispose(disposing);
}
}
然后将HttpResponseException与该响应一起抛出,并将断点置于Dispose覆盖中.您将观察到Dispose被调用,并且如果您查看调用堆栈,您将看到HttpControllerHandler负责执行此操作(在asp.net Web api控制器中).
请注意,此异常由负责调用您的api控制器动作的ApiControllerActionInvoker捕获.然后,它仅捕获yourException.Response并将其通过管道推进,因此引发此异常与仅从api控制器操作返回相应的响应没有什么不同.应该清楚的是,我认为框架将在完成所有这些响应后将其丢弃.否则,这将是非常糟糕的设计.
因此,不要用那些RegisterForDispose使代码混乱,让框架为您处理.
内容总结
以上是互联网集市为您收集整理的c#-在操作方法内抛出HttpResponseException时处理HttpResponseMessage及其内容全部内容,希望文章能够帮你解决c#-在操作方法内抛出HttpResponseException时处理HttpResponseMessage及其内容所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。