2011-10-10 2 views
1

Im은 WCF Web API를 사용하여 프로그래밍 된 일부 정보를 내 API에 게시하려고합니다. 클라이언트에서 restful을 사용하고 있습니다. 이것은 restful 서비스를위한 휴식 클라이언트입니다. 그러나 요청에 일부 매개 변수를 추가하여 게시하려고하면 서비스의 post 메서드가 호출되지 않고 클라이언트의 내 응답 개체가 500 상태 (내부 서버 오류)를 얻지 만 내가 ' 매개 변수를 추가하면 요청이 서비스에 노출 된 게시 메소드에 도달합니다. 나는 서비스에서 게임 객체가 채워됩니다 그래서 내 요청에 매개 변수를 추가 할 필요가restsharp를 사용하는 WCF 웹 API 서비스의 http 게시

[WebInvoke(UriTemplate = "", Method = "POST")] 
    public HttpResponseMessage<Game> Post(Game game, HttpRequestMessage<Game> request) 
    { 
     if (null == game) 
     { 
      return new HttpResponseMessage<Game>(HttpStatusCode.BadRequest); 
     } 
     var db = new XBoxGames(); 
     game = db.Games.Add(game); 
     db.SaveChanges(); 

     HttpResponseMessage<Game> response = new HttpResponseMessage<Game>(game); 
     response.StatusCode = HttpStatusCode.Created; 

     var uriBuilder = new UriBuilder(request.RequestUri); 
     uriBuilder.Path = string.Format("games/{0}", game.Id); 
     response.Headers.Location = uriBuilder.Uri; 
     return response; 
    } 

다음은 서비스에 대한 코드의

[HttpPost] 
    public ActionResult Create(Game game) 
    { 
     if (ModelState.IsValid) 
     { 
      var request = new RestRequest(Method.POST); 
      var restClient = new RestClient(); 
      restClient.BaseUrl = "http://localhost:4778"; 
      request.Resource = "games"; 
      //request.AddParameter("Name", game.Name,ParameterType.GetOrPost); this is te line when commented  everything works fine 
      RestResponse<Game> g = restClient.Execute<Game>(request); 
      return RedirectToAction("Details", new {id=g.Data.Id }); 
     } 
     return View(game); 
    } 

:

다음은 클라이언트의 코드입니다 하지만 매개 변수를 추가하려고 할 때마다 서비스가 중단되는 경우이를 수행하는 방법을 모른다.

클라이언트와 서버 모두 .NET MVC 3 응용 프로그램이라는 것을 잊어 버렸습니다.

도움을 주시면 감사하겠습니다. 미리 감사드립니다.

답변

1

게임을 매개 변수로 사용하고 HttpRequestMessage를 사용하고있는 것으로 나타났습니다. 당신은 이것을 할 필요가 없습니다. 요청 (예 : 요청 매개 변수)을 받으면 Content Property에서 ReadAs를 호출하면 Game 인스턴스가 생성됩니다. 게임을 두 번 통과시키고 있다는 사실이이 문제의 원인 일 수 있습니다. 두 번째 게임 매개 변수를 제거하고 응답에있는 매개 변수를 사용해볼 수 있습니까?

WCF 웹 API는 양식 URL 인코딩을 지원합니다. 미리보기 5에서 MapServiceRoute 확장 메서드를 사용하는 경우 자동으로 연결됩니다. 그렇지 않은 경우 WebApiConfiguration 객체를 만들어 ServiceHostFactory/ServiceHost에 전달합니다.

+0

문제가 해결되었습니다. 고마워요! – Daniel

0

저는 여러분이 호출하는 객체에 익숙하지 않지만 게임입니다. 문자열에 이름을 지정 하시겠습니까? 그렇지 않은 경우 AddParameter가 실패하는 이유가 설명 될 수 있습니다.

+0

예, 문자열입니다. – Daniel

1

이 문제를 계속 반복 한 후에도 마침내 해결책을 찾았지만 왜 이런 일이 발생하는지 설명 할 수 없습니다.

addBody에 대한 addParameter 메소드를 대체했으며 모든 것이 예상대로 작동 했으므로 서버에 정보를 게시 할 수있었습니다.

addParameter 메서드를 통해 매개 변수를 추가 할 때마다이 메서드는 application/x-www-form-urlencoded로 매개 변수를 추가하고 WCF 웹 API가이 유형의 데이터를 지원하지 않는 것으로 보입니다. 클라이언트에 내부 서버 오류를 반환하는 이유입니다.

반대로 addBody 메소드는 서버가 이해할 수있는 text/xml을 사용합니다.

다시 말하지만, 이것이 실제로 발생하는지는 알 수 없습니다.하지만 그럴 것 같습니다.

이 내 클라이언트 코드가 지금 모습입니다 :

[HttpPost]   
    public ActionResult Create(Game game) 
    { 
     if (ModelState.IsValid) 
     { 
      RestClient restClient = new RestClient("http://localhost:4778"); 
      RestRequest request = new RestRequest("games/daniel",Method.POST); 
      request.AddBody(game); 
      RestResponse response = restClient.Execute(request); 
      if (response.StatusCode != System.Net.HttpStatusCode.InternalServerError) 
      { 
       return RedirectToAction("Index"); 
      } 
     } 
     return View(game); 

하시기 바랍니다 어떤 의견을 가지고, 또는 알려 세드릭 알고있는 경우.