使用以SelfHost方式寄宿WebAPI是, 如果处理不存在的URL, 怎样能返回自己的错误消息, 而不是框架自己的消息。不存在的URL有三种情况:
1、controller存在,action不存在。
2、controller不存在,但URL能被Routes匹配。
3、URL不能被Routes匹配。 1和2分别可以通过 ApiControllerActionSelector 、DefaultHttpControllerSelector 来实现。 第三种情况就不清楚怎么处理了。谢谢
1、controller存在,action不存在。
2、controller不存在,但URL能被Routes匹配。
3、URL不能被Routes匹配。 1和2分别可以通过 ApiControllerActionSelector 、DefaultHttpControllerSelector 来实现。 第三种情况就不清楚怎么处理了。谢谢
解决方案 »
- 有时会有: DataBinding:“System.Data.DataRowView”不包含名为“id”的属性
- c# 进程间通信 有什么方式呢?
- asp.net代码里 很少用到get和set 呀,,,是不是不算正规的C#程序呀
- 正在做一个拍卖网站,请大家帮我解决2条sql语句的问题。
- [100分求助]向Response.OutputStream输出图片时,为什么只有bmp文件出错?
- 请问各位大虾~~DataGrid内容导出到excel 的问题
- 这句什么意思?
- 马上要去面试了,做ASP.net+c#大家指点一下啊!谢谢了
- 请求思路,那些论坛上的在线人员显示是怎么做的呀?
- 谁能帮忙做一个图书馆查询系统啊?我给3946分
- VS2015,Win10,调试时:“另一个调试器已连接到该Web服务器”
- vs2015无法选择framework版本
ExceptionFilterAttribute 太晚了, 是捕捉action内部的错误, 没办法实现上面的功能。
http://blog.csdn.net/starfd/article/details/41728655
我现在是想提供一系列API, 具体什么客户端调用现在是不考虑的。 我现在只想保证我的API是按约定的标准来发送数据的。
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
注册这个路由后, 访问http://127.0.0.1:8280/api/asdasd , 是能到DefaultHttpControllerSelector中的SelectController方法的,在这里能判断到asdasdController 是否存在,但是如果访问的是 http://127.0.0.1:8280/api2/asdasd 这种不复合规则的URL就不会到SelectController方法中。 因为没有匹配成功, 就不会创建Controller 。我尝试要匹配所有的URL,把不符合规则的跳转到指定的Controller中, 但是不知道该怎么写MapHttpRoute,因为写多了就容易乱匹配。
这个应该是要重写route匹配那一块了
对,就是404了, 我就是要拦着框架自己的404的消息。 返回我自己的消息。 现在不清楚怎么重写route那块, 通过重写IHttpRouteConstraint好像不行。或者有没有办法拦截框架的消息
throw Error.Argument("name", SRResources.RouteCollection_NameNotFound, new object[]
{
name
});框架自己的消息基本上都是 throw Error.Argument 或者 throw new HttpResponseException
研究下这个去吧,应该就是重写Route的部分代码,这个可能需要去下载MVC的源代码了,还要与你实际的MVC版本对应
在web.config里面写好可能出现的各种{controller}/{id}
在begin_request 里判断url是否匹配{controller}/{id},不匹配就丢一个返回值。
{
using System.Net;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks; /// <summary>
/// 自定义消息处理器,用HttpConfiguration.MessageHandlers.Add(obj)注册。
/// </summary>
public class WebNMSMessageHandler : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
// 通过base.SendAsync()将消息传递给管道的下一个节点。
return base.SendAsync(request, cancellationToken).ContinueWith(
(t) =>
{
HttpResponseMessage response = t.Result;
// 在此,可以过滤你想要的任何错误代码。
if (response.StatusCode != HttpStatusCode.OK)
{
// 就丢弃应答中所有错误描述信息。
response.Content = null;
}
return response;
}, cancellationToken);
}
}
}
然后在Main函数里,把上面的类型的实例添加到全局configuration对象:config.MessageHandlers.Add(new WebNMSMessageHandler());
就是这么简单。原理就是在消息处理管道里添加自定以消息处理器,这样可以捕获输入的request和输出的resopnse。