以SelfHost方式寄宿WebAPI的一些问题。

问题描述

使用以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},不匹配就丢一个返回值。

时间: 2024-10-08 10:41:59

以SelfHost方式寄宿WebAPI的一些问题。的相关文章

关于以Self Host方式寄宿Web API后路由的问题

问题描述 寄宿的代码:staticvoidMain(string[]args){Assembly.Load("JX.APP.API,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null");HttpSelfHostConfigurationconfiguration=newHttpSelfHostConfiguration("http://localhost:8081/selfhost");configuration

Silverlight与WCF之间的通信(3)利用net.tcp绑定方式寄宿到到控制台交互数据

最近的项目比较紧,写博客的时间基本都用来看文档和视频了,很感谢老大给了这么多时间让我研究 ,好几种方案都被我给毙了,因为有要兼顾其他模块,视频聊天的P2P模式也在silverlight下搞不了,看 了唯一的一个例子居然还是基于LiveMessage的,silverlight快点支持P2P吧!!目前在数据传递方面基 本确定了用WCF来搞定一切,包括聊天,视频和文件传递,不过不能再采用HTTP协议了,改用net.tcp来做 ,直接host到控制台,试了试IIS,但是比较复杂,明天再调试一下将wcf服

通过几个Hello World感受.NET Core全新的开发体验

2016年6月27日,这是一个特殊的日子,微软全新的.NET开发平台.NET Core的RTM版本正式发布.我个人将.NET Core的核心特性归结为三点,它们的首字母组成一个非常好记的简称--COM,分别代表的含义Cross-Platform.Open-Source和Modularization.开发.NET Core应用的方式与之前具有非常大的变化,对于那些尚未体验过.NET Core的朋友,我希望通过本篇文章创建的这j几个Hello World应用可以很容易地带你们快速入门. 首先我们会介

WCF技术剖析之二十: 服务在WCF体系中是如何被描述的?

任何一个程序都需要运行于一个确定的进程中,进程是一个容器,其中包含程序实例运行所需的资源.同理,一个WCF服务的监听与执行同样需要通过一个进程来承载.我们将为WCF服务创建或指定一个进程的方式称为服务寄宿(Service Hosting).服务寄宿的本质通过某种方式,创建或者指定一个进程用以监听服务的请求和执行服务操作,为服务提供一个运行环境. 服务寄宿的方式大体分两种:一种是为一组WCF服务创建一个托管的应用程序,通过手工启动程序的方式对服务进行寄宿,所有的托管的应用程序均可作为WCF服务的宿

[WCF安全系列]服务凭证(Service Credential)与服务身份(Service Identity)

在采用TLS/SSL实现Transport安全的情况下,客户端对服务证书实施认证.但是在默认情况下,这种认证仅仅是确保服务证书的合法性(通过数字签名确保证书确实是由申明的CA颁发)和可信任性(证书或者CA证书存储于相应的可信赖存储区).而WCF提供服务证书并不限于此,客户端对服务认证的模式应该是这样的:服务端预先知道了服务的身份,在进行服务调用之前,服务端需要提供相应的凭证用以辅助客户端确认调用的服务具有预先确定的身份.对于这样的服务认证模式,具有两个重要的概念,即服务凭证和服务身份. 目录:

《WCF全面解析》(上册)- 目录

第1章  WCF简介 (WCF Overview)    1    1.1  SOA的基本概念和设计思想    3    1.2  WCF是对现有分布式通信技术的整合    4    1.3  构建一个简单的WCF应用    6        步骤一.构建整个解决方案    7        步骤二.创建服务契约    8        步骤三  创建服务    8        步骤四  通过自我寄宿的方式寄宿服务    9        步骤五  创建客户端调用服务    12       

《WCF技术剖析(卷1)》(修订版)目录

第1章  WCF简介 (WCF Overview) 1.1  SOA的基本概念和设计思想 1.2  WCF是对现有Windows平台下分布式通信技术的整合 1.3  构建一个简单的WCF应用 1.3.1  步骤一  构建整个解决方案 1.3.2  步骤二  创建服务契约 1.3.3  步骤三  创建服务 1.3.4  步骤四  通过自我寄宿的方式寄宿服务 1.3.5  步骤五  创建客户端调用服务 1.3.6  步骤六  通过IIS寄宿服务(S104) 第2章  地址(Address) 2.1.

SQL Server Management Object(SMO)大大简化数据库工具的开发 几行代码开发功能强大的SQL工具

原文 http://www.cnblogs.com/JamesLi2015/archive/2013/05/24/3096214.html 开发与数据库有关的程序,经常需要对数据库进行自动化操作,而不是打开SQL Server Management Studio来写SQL或是图形化操作数据,于是需要一个公共类库,可以处理SQL Server有关的基础操作,比如连接数据库,读取所有的表,修改存储过程,读取表的所有字段及其类型.目前为止,我找到以下方法 1  DMO (legacy of SQL S

WCF在IIS下运行频繁处于假死状态

问题描述 IIS使用DebugDiag跟踪到的信息:clr!StrongNameSignatureVerification方法大量被调用是否存在问题WCF函数逻辑及假死现象:在wcf中的函数做一系列的处理,最后将处理的结果在事务中将多个表提交到数据库出现假死时日志记录到从数据库获取数据本来只要10多毫秒会变成700多毫秒,但数据库端没有看到磁盘响应和队列增高的情况,WCF所有iis与数据库是两台服务器据说IIS有2000多种死法,请各位大侠支招 解决方案 解决方案二:这个看不懂--解决方案三:个