私はそのようなメソッドを持つ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しようとしました。任意のアドバイスをいただければ幸いです。
ちょっと考えてみてください。「。com」が問題を引き起こしている可能性はありますか?
これは、IISが特殊文字をマップしようとしているためです。web.configに以下を追加すると、問題が解決するはずです。
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
</system.webServer>
詳細はこちら: http://www.iis.net/configreference/system.webserver/modules
以下を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=*@*.*
に変更します
基本的なURLクエリが必要です。
[Route("api/emails")]
public HttpResponseMessage Run(string email) {...}
GET api/[email protected]