带有电子邮件地址参数的WebApi方法从HttpClient返回404

时间:2013-08-06 16:31:53

标签: c# asp.net asp.net-mvc-4 asp.net-web-api

我有一个WebApi控制器,其方法如下:

[HttpGet]
[AcceptVerbs("GET")]
public HttpResponseMessage Run(string reportName, int someId, string someText, DateTime asOfDate, string username)

我有专门为此操作配置的自定义路由。当我将浏览器导航到Web服务时,一切正常,并执行相应的操作:

http://localhost:xxxx/ControllerName/Run/asdf/1/asdf/07-01-2012/user@domain.com

但是,当我尝试使用HttpClient以编程方式调用Web服务并执行“Get”时,我收到404错误。当username参数不是电子邮件地址时,我不会收到错误。例如,当用户名只是“用户”时,一切正常。以下是示例代码:

var url = "http://localhost:xxxx/ControllerName/Run/asdf/1/asdf/07-01-2012/user@domain.com"
var client = new System.Net.Http.HttpClient();
var response = client.Get(url);

//fails here with 404 error
response.EnsureSuccessStatusCode();

我已经尝试过UrlEncoding电子邮件地址而没有运气。任何建议都表示赞赏。

4 个答案:

答案 0 :(得分:33)

只是一个简单的想法......“。com”会引起这个问题吗?

答案 1 :(得分:18)

这是因为IIS正在尝试映射特殊字符。将以下内容添加到web.config应该可以解决问题:

<system.webServer>  
     <modules runAllManagedModulesForAllRequests="true" />
</system.webServer>

此处提供更多信息:http://www.iis.net/configreference/system.webserver/modules

答案 2 :(得分:0)

您需要一个基本的网址查询。

[Route("api/emails")]
public HttpResponseMessage Run(string email) {...}

GET api/emails?email=user@domain.com

答案 3 :(得分:0)

在web.config中添加以下内容不能解决完整问题:

<system.webServer>  
     <modules runAllManagedModulesForAllRequests="true" />
</system.webServer>

该解决方案不再起作用,因为我在uri中使用了额外的路径段。 https://localhost:xxxx/user@domain.com确实有效

https://localhost:xxxx/path/user@domain.com不起作用

我在Google周围搜索,我知道这是一个扩展。 (.cs与.com给出了不同的错误),最后找到了这个:ASP.net MVC4 WebApi route with file-name in it

我的解决方案是在<handlers>的{​​{1}}部分中添加或更改以下处理程序:

<system.webServer>

或将路径更改为<remove name="ExtensionlessUrlHandler-Integrated-4.0" /> <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*.*" verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />