C# 带有email address参数的WebApi方法从HttpClient返回404

C# 带有email address参数的WebApi方法从HttpClient返回404,c#,asp.net,asp.net-mvc-4,asp.net-web-api,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/ControllerNa

我有一个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参数不是电子邮件地址时,我没有收到错误。例如,当用户名只是“user”时,一切正常。以下是示例代码:

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();

我尝试过对电子邮件地址进行URL编码,但没有成功。任何建议都将不胜感激。

请快速思考。。。“.com”可能是问题的原因吗?

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

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


此处的更多信息:

您需要一个基本的URL查询

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

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

将以下内容添加到web.config不应解决完整问题:

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

或者将路径更改为
path=*@**.

尝试将@替换为%40-编辑-只是一个完全的随机猜测-Edit2-UrlEncoding应该为您切换它,因此如果我告诉您的方法有效,您可能需要检查如何使用UrlEncoding和可能的参数。考虑到请求的复杂性,您可能需要使用
POST
动词,并改为发送自定义复杂对象。然后您还跳过了一些其他问题,例如无法在任何字符串中传递字符
/
。@Pluc,我给了您的建议一次尝试,但没有如预期的那样成功,因为这正是urlecode所做的。谢谢你。@MattWolin浏览器RESTAPI的可测试性不应该是你关注的焦点。相反,最好使用单元测试。如果您需要手动测试某些内容,只需使用Fiddler或浏览器插件提交请求即可。可能为时已晚,但对我来说,使用
/
-
https://localhost:xxxx/user@domain.com
不起作用-
https://localhost:xxxx/user@domain.com/
真管用哇,谢谢!它实际上是引起问题的“.”字符,而不是“@”符号。看完这篇文章后:我刚刚在最后一个参数的路由中添加了一个尾随“/”,它就像一个符咒一样工作。这是我认为我们将采用的修复方法,尽管我想看看是否会因为它而出现任何其他问题。@Codeacula性能最差,因为托管模块将用于服务静态内容。如果内容需要任何类型的身份验证,这将是一件好事。
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" 
           path="*.*" 
           verb="*" 
           type="System.Web.Handlers.TransferRequestHandler" 
           preCondition="integratedMode,runtimeVersionv4.0" />