问题描述
使用以SelfHost方式寄宿WebAPI是,如果处理不存在的URL,怎样能返回自己的错误消息,而不是框架自己的消息。不存在的URL有三种情况:1、controller存在,action不存在。2、controller不存在,但URL能被Routes匹配。3、URL不能被Routes匹配。1和2分别可以通过ApiControllerActionSelector、DefaultHttpControllerSelector来实现。第三种情况就不清楚怎么处理了。谢谢
解决方案
解决方案二:
是否可以通过ExceptionFilterAttribute来捕获不匹配?没试验过
解决方案三:
引用1楼starfd的回复:
是否可以通过ExceptionFilterAttribute来捕获不匹配?没试验过
ExceptionFilterAttribute太晚了,是捕捉action内部的错误,没办法实现上面的功能。
解决方案四:
那要不你就重写DefaultHttpControllerSelector,不能匹配也是这个东西决定的
解决方案五:
你可以在客户端封装一个通用方法来处理需要处理的返回状态,而不是仅仅抄标准的实现代码。
解决方案六:
贴出你的客户端代码。你可以看到,完全可以自定义一个自己的输入输出函数,来取代原先的函数。
解决方案七:
引用5楼sp1234的回复:
贴出你的客户端代码。你可以看到,完全可以自定义一个自己的输入输出函数,来取代原先的函数。
我现在是想提供一系列API,具体什么客户端调用现在是不考虑的。我现在只想保证我的API是按约定的标准来发送数据的。
解决方案八:
引用3楼starfd的回复:
那要不你就重写DefaultHttpControllerSelector,不能匹配也是这个东西决定的
DefaultHttpControllerSelector也是匹配成功后才只能,情况2就是用做个解决的。但是匹配不成功就没办法了。config.Routes.MapHttpRoute(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,因为写多了就容易乱匹配。
解决方案九:
Url不匹配的话那不就是404了吗?这个应该是要重写route匹配那一块了
解决方案十:
lz研究的这个问题,看起来挺高深。但是直觉告诉我,#8大神的回复是正确的
解决方案十一:
引用8楼starfd的回复:
Url不匹配的话那不就是404了吗?这个应该是要重写route匹配那一块了
对,就是404了,我就是要拦着框架自己的404的消息。返回我自己的消息。现在不清楚怎么重写route那块,通过重写IHttpRouteConstraint好像不行。或者有没有办法拦截框架的消息throwError.Argument("name",SRResources.RouteCollection_NameNotFound,newobject[]{name});
框架自己的消息基本上都是throwError.Argument或者thrownewHttpResponseException
解决方案十二:
研究下这个去吧,应该就是重写Route的部分代码,这个可能需要去下载MVC的源代码了,还要与你实际的MVC版本对应
解决方案十三:
不灵活的笨办法有一个现成的:在web.config里面写好可能出现的各种{controller}/{id}在begin_request里判断url是否匹配{controller}/{id},不匹配就丢一个返回值。