HTTP-пост на веб-API WCF-сервиса с использованием restsharp - PullRequest
1 голос
/ 10 октября 2011

Я пытаюсь опубликовать некоторую информацию в моем API, который запрограммирован с помощью WCF Web Api.В клиенте я использую Restsharp, который является клиентом отдыха для остальных услуг.Однако, когда я пытаюсь опубликовать добавление некоторых параметров в запрос, метод post в службе никогда не вызывается, и мой объект ответа в клиенте получает статус 500 (внутренняя ошибка сервера), но когда я комментирую строки, где я 'После добавления параметров запрос достигает метода post, выставленного в сервисе.

Вот код от клиента:

[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);
    }

Вот код сервиса:

[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;
    }

Мне нужно добавить параметры в мой запрос, чтобы игровой объект в сервисе заполнялся, но я не знаю, как это сделать, если сервис ломается каждый раз, когда я пытаюсь добавить параметры.

Я забылОтметим, что и клиент, и сервер являются приложениями .NET MVC 3.

Любая помощь будет признательна.Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 12 октября 2011

Хорошо, обойдя эту проблему снова и снова, я, наконец, нашел решение, однако не могу объяснить, почему это происходит.

Я заменил метод addParameter на addBody, и все заработало какожидается, что я мог бы разместить информацию на сервере.

Проблема, похоже, заключается в том, что всякий раз, когда я добавляю параметры с помощью метода addParameter, этот метод добавляет параметры как application / x-www-form-urlencoded и, по-видимому,Веб-API WCF не поддерживает этот тип данных, поэтому он возвращает клиенту внутреннюю ошибку сервера.

В противоположность этому метод addBody использует текст / 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);

Пожалуйста, если у вас естьЛюбой отзыв или узнать, что происходит, дайте мне знать.

1 голос
/ 12 октября 2011

Я заметил, что вы принимаете Game в качестве параметра и в HttpRequestMessage.Вам не нужно делать это.Получив запрос (т. Е. Параметр запроса), вы можете вызвать ReadAs в свойстве Content и получить экземпляр Game.Тот факт, что вы проходите игру дважды, вероятно, является причиной проблемы.Можете ли вы попробовать удалить второй игровой параметр и просто использовать его в ответе?

Веб-API WCF поддерживает кодировку URL-адреса формы.В Preview 5, если вы используете метод расширения MapServiceRoute, он будет автоматически подключен.Если это не так, создайте объект WebApiConfiguration и передайте его в ServiceHostFactory / ServiceHost.

0 голосов
/ 10 октября 2011

Я не знаком с объектами, которые вы вызываете, но является ли game.Name строкой?Если это не так, это может объяснить причину сбоя AddParameter.

...