2016-07-05 6 views
1

MVCとWeb Apiの両方のASP.NETアプリケーションを作成しようとしています。デフォルトコントローラ(HomeController)は、HTMLとjQueryで構成されるビューを返します。私は同じプロジェクトの一部であるAPIを呼び出すためにjQueryを使いたいと思います。MVC/WebApiコンボプロジェクトで属性ルーティングが失敗する

APIのセットアップがあり、Postmanでテストしていますが、APIのエンドポイントに到達しようとすると次のエラーが発生します。

{ 
    "Message": "No HTTP resource was found that matches the request URI 'http://localhost:19925/api/encryption/encrypt'.", 
    "MessageDetail": "No action was found on the controller 'Values' that matches the request." 
} 

私はので、私は私が間違っているつもりですどこつまりかなり確信しているルーティング属性を使用しようとしています。

[RoutePrefix("api/encryption")] 
    public class ValuesController : ApiController 
    { 
     [HttpPost] 
     [Route("encrypt")] 
     public IHttpActionResult EncryptText(string plainText, string keyPassPhrase) 
     { 
      // Method details here 

      return Ok(cipherText); 
     } 
} 

私はapi/encryptionに設定されたルートプレフィックスを持っています。私はまた道encryptを使用してHttpPostとしてマークされた方法を持っています。以下は私のWebApiConfigですが、属性ルーティング用に適切に設定されていると思います。私の理解の方法に到達する必要があり、次のURLにPOSTことで

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     // Web API configuration and services 

     // Web API routes 
     config.MapHttpAttributeRoutes(); 

     // Default MVC routing 
     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
    } 
} 

..

http://localhost:19925/api/encryption/encrypt

をまだそうではありません。私は2つの文字列値をPostman経由でメソッドにポストします。私はスクリーンキャプチャを付けました(そして、はい、keyPassPhraseは偽です)。ここで enter image description here

限り、私のように...要求...

public class WebApiApplication : System.Web.HttpApplication 
{ 
    protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 
     GlobalConfiguration.Configure(WebApiConfig.Register); 
     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 
     BundleConfig.RegisterBundles(BundleTable.Bundles); 
    } 
} 

注意する...私はポストマンにGETからPOSTに変更したときに、それが動作することをもうひとつとしてGlobal.asaxのですクエリ文字列に沿ってパラメータを送信しています。私が体内のパラメータを送信すると、元のエラーが出ます。

+0

あなたが使用している '[Route]'と '[HttpPost']属性の完全な名前空間は何ですか? – haim770

+0

名前空間は '名前空間EncryptionDemo.Controllers'です。 ValuesControllerは、ASP.NETプロジェクトによって生成されるデフォルトのコントローラです。インデックスメソッドを削除して自分自身を追加しました。 – webworm

+0

私は '[Route]'と '[HttpPost]'属性の完全な名前空間について尋ねました。コントローラーではありません... – haim770

答えて

0

問題は、2つのパラメータを受け入れるAPIメソッドに2つの値をPOSTしようとしていたことでした。これは、APIメソッドでは2つの異なるプリミティブ型(Stringなど)ではなくオブジェクトが必要なため、APIではできません(いくつかの回避策はありません)。

これはサーバー側で、私が渡したい値を保持する単純なクラスを作成する必要があることを意味します。たとえば...

public class EncryptionPayload 
{ 
    public string PlainText { get; set; } 
    public string PassPhrase { get; set; } 
} 

私はその後、私はEncryptionPayloadクラスのインスタンスから必要なStringsを引っ張っているコントローラ内部で次に、このクラスの型

[Route("encrypt")] 
    [HttpPost] 
    public IHttpActionResult EncryptText(EncryptionPayload payload) 
    { 
     string plainText = payload.PlainText; 
     string passPhrase = payload.PassPhrase 

     // Do encryption stuff here 

     return Ok(cipherText); 
    } 

を受け入れるように、私のAPIの方法を変更しました。クライアント側では私はこのようなJSON文字列としての私のデータを送信するために必要な..

{"plainText":"this is some plain text","passPhrase":"abcdefghijklmnopqrstuvwxyz"} 

をポストマンで働いていたこれらの事のすべてを変更した後。最後に、私はModel Bindingを考慮していないので、POSTを受け入れたAPIエンドポイントが複数のプリミティブ値を受け入れることができると考えていました。

このpost from Rick Strahlがわかりました。 This page from Microsoftのパラメータバインディングについても、というメッセージで説明しています。

-1

次のコードを試してください。それは動作します:

[RoutePrefix("api/encryption")] 
    public class ValuesController : ApiController 
    { 

     [Route("encrypt"),HttpPost] 
     public IHttpActionResult EncryptText(string plainText, string keyPassPhrase) 
     { 
      // Method details here 

      return Ok(cipherText); 
     } 
} 

申し訳ありません本当にコンパイル時エラーです。私は自分のコードを編集する。コピーしてあなたのコードに貼り付けてください。もし私が助けてくれたら答えとしてマークしてください。

+0

私は試しましたが、コンパイルエラーが発生しました '名前 'HttpPost'は現在のコンテキストに存在しません' – webworm

+0

助けてくれてありがとうございます。 – webworm

関連する問題