web-dev-qa-db-ja.com

電子メールアドレスパラメーターを指定したWebApiメソッドがHttpClientから404を返す

私はそのようなメソッドを持つ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/[email protected]

しかし、HttpClientを使用してプログラムでWebサービスを呼び出し、「取得」を実行しようとすると、404エラーが発生します。ユーザー名パラメーターがメールアドレスではない場合でも、エラーは発生しません。たとえば、ユーザー名が「user」だけの場合、すべてが正常に機能します。これがサンプルコードです:

var url = "http://localhost:xxxx/ControllerName/Run/asdf/1/asdf/07-01-2012/[email protected]"
var client = new System.Net.Http.HttpClient();
var response = client.Get(url);

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

私は運が悪いのにメールアドレスをUrlEncodingしようとしました。任意のアドバイスをいただければ幸いです。

31
Matt Wolin

ちょっと考えてみてください。「。com」が問題を引き起こしている可能性はありますか?

34
Ryan Ferretti

これは、IISが特殊文字をマップしようとしているためです。web.configに以下を追加すると、問題が解決するはずです。

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

詳細はこちら: http://www.iis.net/configreference/system.webserver/modules

19
DataPispor

以下をweb.configに追加しても、完全な問題は修正されません。

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

余分なパスセグメントがURIで使用されているため、このソリューションは機能しなくなりました。 https://localhost:xxxx/[email protected]は機能します

https://localhost:xxxx/path/[email protected]が機能しない

私はぐるぐる回ってググっていて、それが拡張機能であることを理解しました。 (.csは.comとは異なるエラーを出します)そして最後にこれを見つけます: ASP.net MVC4 WebApiルートにファイル名が含まれています

私の解決策は、<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=*@*.*に変更します

1
Roberto B

基本的なURLクエリが必要です。

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

GET api/[email protected]