35

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

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

4 回答 4

40

只是一个快速的想法......“.com”会导致问题吗?

于 2013-08-07T16:38:46.527 回答
22

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

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

更多信息在这里:http ://www.iis.net/configreference/system.webserver/modules

于 2014-09-02T09:40:37.890 回答
1

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

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

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

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

我四处搜索,我明白这是一个扩展。(.cs 给出与 .com 不同的错误)并最终找到:ASP.net MVC4 WebApi route with file-name in it

<handlers>我的解决方案是在您的部分添加或更改以下处理程序<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" />

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

于 2018-07-19T14:16:05.487 回答
1

您需要一个基本的 URL 查询。

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

GET api/emails?email=user@domain.com
于 2016-09-20T05:39:07.800 回答