2017-10-31 15 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 웹 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/{컨트롤러}/{id}",'이미'id '가 경로의 기본 매개 변수라는 것을 이미 정의했기 때문에 ** id = ** 쿼리 문자열 인수가 URL. –

답변

0

앞서 언급 한 것처럼 기본 경로의 일부로 id를 정의했습니다. 즉, API 컨트롤러가 id를 인수로 받아들이는 메서드를 가지고있을 때 라우팅 엔진은 쿼리 문자열이 아닌 uri에서이를 찾을 것으로 예상합니다.

위의 POST 예제에서 DoRequest 코드에서 인수 이름을 id에서 postId로 변경하고 id를 postId로 변경하면 작동합니다.

또 다른 옵션은 routeTemplate에서 {id}를 제거하고 id의 기본값도 제거하는 것입니다.

+0

고마워요. –

0

쿼리 문자열이 경로의 일부가 아닌 중요한 경우 내 경로 설정입니다 .

따라서 컨트롤러 접두사에 아무 것도 추가하지 않는 추가 경로를 추가하려면 [Route("")]을 추가해야합니다.

+0

https://stackoverflow.com/questions/22642874/quest-string-not-working-while-using-attribute- 루팅이 여러 방법으로 표시된 경우 작동하지 않습니다 –