5

を持っている必要があります私はasp.netのWeb APIプロジェクトを持っている、と私WebApiConfigファイルで、私は定義された次のルートを持っている:統合テストのためにルート上の制約エントリの「HTTPMETHOD」文字列値

config.Routes.MapHttpRoute(
    name: "Web API Get", 
    routeTemplate: "api/{controller}", 
    defaults: new { action = "Get" }, 
    constraints: new { httpMethod = new HttpMethodConstraint("GET") } 
    ); 

目的のために、私はHttpSelfHostServerに、api呼び出しから正しいデータを受け取っていることを確認するようにリクエストしたいと思います。次のように私はHttpRequestMessageを作っています:

var httpMethod = new HttpMethod("GET"); 
var request = new HttpRequestMessage(httpMethod, "http://localhost:XXXX/api/User/"); 
var results = _client.SendAsync(request).Result; 

私はこれがUserControllerでのGetメソッドを呼び出し、そのメソッドで定義された結果を返すことを期待します。しかし、代わりに次の例外が発生します。

System.InvalidOperationException:ルートテンプレート 'api/{controller}'を持つルートの制約エントリ 'httpMethod'は、文字列値を持つか、私は、ブラウザでそれを使用する場合IHttpRouteConstraint」

この同じURL(http://localhost:XXXX/api/User/)がエラーなしで動作しますので、私は問題は、私がHttpClientを通じてHttpSelfHostServerにリクエストを送信していた方法でなければならないかなり確信しています。代わりにHttpMethod.Get定数を使用しようとしましたが、同じエラーが発生しました。

この問題を解決する方法を知っている人はいますか?

+0

http://emilsblog.lerch.org/2012/05/constraint-for-route-parameter.html –

+0

私が提案しているソリューションを使用するためにWebApi Urlオブジェクトにアクセスする権限がありません。ルートの方向がRouteDirection.UrlGenerationであり、httpMethodが見つからないことがわかります(したがって例外です)。 Url.Action()メソッドを使用せずに、リクエストに「GET」という文字列値を持つhttpMethodを取得するにはどうすればよいですか? – scourge192

+0

さて、私はコントローラのUrlオブジェクトと同じことをするUrlHelperクラスを見つけました。しかし、今は構成オブジェクトに関連した新しいエラーが発生しています。私はすぐに詳細を追加して私の質問を更新します... – scourge192

答えて

13

あなたの制約のためproper typeを使用していることを確認してください:

constraints: new { httpMethod = new System.Web.Http.Routing.HttpMethodConstraint(HttpMethod.Get) } 

私はあなたがASP.NET MVCのルーティングに使用完全に異なるクラスであり、ASPとは何の関係も持た​​ないSystem.Web.Routing.HttpMethodConstraintを使用していたと思います.NET Web APIルーティング。

+0

うわー、そうだった。ありがとう、私はしばらくの間、その頭に打ち負かされてきた。 – scourge192

+4

はい、マイクロソフトでは、MVCで利用可能だったが、異なるアセンブリと名前空間で使用できるこのWeb APIのすべての単一クラスを二重にしたときに、混乱の1つを作成しました。間違いの原因は非常に一般的です。 –

+0

偉大な答え、それは本当によくダーディーディミトロフ、感謝を見つけた。 – nickspoon

関連する問題