1

WCFWebApiを使用してプログラムされたAPIにいくつかの情報を投稿しようとしています。クライアントでは、RESTfulサービスのRESTクライアントであるrestsharpを使用しています。ただし、リクエストにいくつかのパラメーターを追加してpostしようとすると、サービスのpostメソッドが呼び出されず、クライアントの応答オブジェクトが500ステータス(内部サーバーエラー)になりますが、次の行にコメントすると、 mパラメータを追加すると、リクエストはサービスで公開されている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;
    }

サービス内のゲームオブジェクトにデータが入力されるように、リクエストにパラメーターを追加する必要がありますが、パラメーターを追加しようとするたびにサービスが中断した場合、これを行う方法がわかりません。

クライアントとサーバーの両方が.NETMVC3アプリケーションであることを忘れました。

どんな助けでもそれをいただければ幸いです。前もって感謝します。

4

3 に答える 3

1

この問題を何度も繰り返した後、ようやく解決策を見つけましたが、なぜこれが起こっているのか説明できません。

addBodyのaddParameterメソッドを置き換えましたが、すべてが期待どおりに機能し、サーバーに情報を投稿できました。

問題は、addParameterメソッドを使用してパラメーターを追加するときはいつでも、このメソッドがapplication / x-www-form-urlencodedとしてパラメーターを追加することであり、明らかにWCF Web 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);

フィードバックがある場合、または何が起こっているのかを知っている場合は、私に知らせてください。

于 2011-10-11T20:28:30.540 に答える
1

Game をパラメーターとして、HttpRequestMessage で使用していることに気付きました。これを行う必要はありません。リクエスト (つまり、リクエスト パラメータ) を取得したら、Content プロパティで ReadAs を呼び出すことができ、Game インスタンスを取得できます。Game を 2 回パスしているという事実が、おそらく問題の原因です。2 番目のゲーム パラメータを削除して、応答で使用することはできますか?

WCF Web API は、フォーム URL エンコーディングをサポートしています。Preview 5 では、MapServiceRoute 拡張メソッドを使用している場合、自動的に接続されます。そうでない場合は、WebApiConfiguration オブジェクトを作成し、それを ServiceHostFactory / ServiceHost に渡します。

于 2011-10-12T04:59:06.793 に答える
0

私はあなたが呼び出しているオブジェクトに精通していませんが、game.Name は文字列ですか? そうでない場合、それが AddParameter が失敗する理由を説明している可能性があります。

于 2011-10-10T18:23:19.823 に答える