6

次のApiControllerがあります

public class ValuesController : ApiController
{
    // GET /api/values
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }

    public User CreateUser(User user)
    {
        user.Id = 1000;
        return user;
    }
}

次のルートで

    routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{action}/{id}",
    defaults: new { id = RouteParameter.Optional });

そして私はこのサービスを利用したいです。私は最初の方法を消費することができます:

    var client = new WebClient();
    var result = client.DownloadString(@"http://localhost:61872/api/values/get");

しかし、私は2番目の方法を消費することはできません。私が次にするとき:

    var user = new User() { Name = "user1", Password = "pass1" };
    var json = Newtonsoft.Json.JsonConvert.SerializeObject(user);
    result = client.UploadString(@"http://localhost:61872/api/values/createuser", json);

追加情報なしで次の例外をキャッチします

リモートサーバーがエラーを返しました:(500)内部サーバーエラー。

2つの質問があります:

  1. カスタムオブジェクトをサービスメソッドパラメータに設定する正しい方法は何ですか?
  2. このような「魔法の」例外に関する追加情報を取得するにはどうすればよいですか?
4

1 に答える 1

8

JSON リクエストを送信する場合は、Content-Typeリクエスト ヘッダーが適切に設定されていることを確認してください。そうしないと、サーバーはリクエストがどのようにエンコードされているかを認識できずuser、Api コントローラー アクションが取るパラメーターが null になります。

using (var client = new WebClient())
{
    client.Headers[HttpRequestHeader.ContentType] = "application/json";
    var user = new User() { Name = "user1", Password = "pass1" };
    var json = Newtonsoft.Json.JsonConvert.SerializeObject(user);
    var result = client.UploadString(@"http://localhost:61872/api/values/createuser", json);
}
于 2012-05-24T11:04:11.730 に答える