2017-10-31 9 views
0

私は、クエリ文字列asp.net web api 2 POSTでクエリ文字列を受け入れる方法はありますか?

http://localhost:53546/api/v1/projects?id=ABA28A61-8898-4739-8464-386C7890E435 

で次を投稿しようとしているコントローラを持っているが、それは、コントローラPOST方法に当たらない

しかし、これは

http://localhost:53546/api/v1/projects/ABA28A61-8898-4739-8464-386C7890E435

を行います

投稿でクエリ文字列を受け入れるにはどうすればよいですか?私は504エラーを取得し続けます:メソッドはサポートされていません。 asp.net Web APIでクエリ文字列を受け入れる特別な構文がありますか?ここで

は私の DoPost方法ここでは私のコントローラ

[RoutePrefix("api/v1/projects")] 
public class ProjectController : ApiController 
{ 
    private RestClient client; 

    public ProjectController() { 
     client = new RestClient("http://localhost:53546"); 
    } 

    [HttpPost] 
    [Route("{id:guid}")] 
    public string Post(Guid id) 
    { 
     return "Here is your Post id - " + id.ToString(); 
    } 
} 

である

public JToken DoRequest(string path, string method, params string[] parameters) 
{ 
    if (!path.StartsWith("/")) 
    { 
     path = "/" + path; 
    } 
    var fullUrl = url + path + ToQueryString(parameters); 

    if (DebugUrls) Console.WriteLine("Requesting: {0}", fullUrl); 

    var request = WebRequest.Create(new Uri(fullUrl)); 
    request.Method = method; 
    request.ContentType = "application/json"; 
    request.ContentLength = 0; 
    var response = request.GetResponseAsync().Result; 
    using (var responseStream = response.GetResponseStream()) 
    { 
     return ReadResponse(responseStream); 
    } 
} 

public static void Register(HttpConfiguration config) 
    { 
     config.MapHttpAttributeRoutes(); 

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

あなたのURLはどのルートとも一致しません。なぜあなたはそれが動作すると思いますか? – SLaks

+0

@SLaks上記のクエリ文字列とルートをどのように一致させることができますか? –

+2

'routeTemplate:" api/{controller}/{id} "、' 'id 'はルート内のデフォルトパラメータであると既に定義されているので、** id = ** URL。 –

答えて

0

前述のとおり、idはデフォルトルートの一部として定義されています。これは、APIコントローラがidを引数として受け入れるメソッドを持っている場合、ルーティングエンジンはクエリ文字列ではなくuriでそれを見つけることを期待することを意味します。

上記のあなたのPOSTの例では、引数名をidからpostIdに変更し、idをDoRequestコードのpostIdに変更した場合、そのコードは機能するはずです。

もう1つの方法は、routeTemplateから{id}を削除し、idのデフォルト値も削除することです。

+0

ありがとうございます。 –

0

クエリ文字列は、ルートの一部ではない重要な場合、これが私のルート設定であります。

したがって、コントローラーのプレフィックスに何も追加しない追加のルートを追加するには、[Route("")]を追加する必要があります。

+0

https://stackoverflow.com/questions/22642874/quest-string-not-working-while-using-attribute-複数の方法でマークされている場合、これは動作しません –

関連する問題