APIをホストする同じアプリケーションからいくつかのASP.NET APIをヒットしたいと思います。現実世界のユースケースは、ファイルをMVCコントローラにアップロードし、解析して、同じアプリケーションでホストされているAPIへのPOSTリクエストを介して別々のAPIコールを作りたいということです。 WebApiコントローラメソッドの中にブレークポイントを設定することで、適切なAPIエンドポイントがヒットしていることがわかりますが、ペイロードは常にnullです。私はFlurl、RestSharp、WebClient、およびWebRequestを使ってリクエストを作成しようとしましたが、どれもペイロードを通過させることはできません。また、ユニット/統合テストでこれらのPOST要求を呼び出そうとすると、ヌル・ペイロードの問題で失敗します。同じホストへのASP.NET POST要求がNULLペイロードになる
ペイロードが同じアプリケーションに投稿されないようにするASP.NETフレームワークには何らかの制限がありますか?
var myObjectRow = new JObject();
myObjectRow["Key"] = 1;
/* RestSharp */
var request = new RestRequest("/api/MyObject", Method.POST);
request.AddHeader("Content-type", "application/json; charset=utf-8");
request.AddBody(request.JsonSerializer.Serialize(myObjectRow));
request.AddJsonBody(myObjectRow);
request.AddParameter("Application/Json", myObjectRow, ParameterType.RequestBody);
var response = RestClient.Execute<MyObject>(request);
/* WebClient */
using (var webClient = new WebClient())
{
webClient.Headers[HttpRequestHeader.ContentType] = "application/json";
var payload = JsonConvert.SerializeObject(myObjectRow);
var response = webClient.UploadString(BaseUrl + "/api/MyObject", "POST", payload);
}
/* WebRequest */
var payload = JsonConvert.SerializeObject(myObjectRow);
byte[] buf = Encoding.UTF8.GetBytes(payload);
var request = (HttpWebRequest)WebRequest.Create(BaseUrl + "/api/MyObject");
request.Method = "POST";
request.ContentLength = buf.Length;
request.ContentType = "application/json; charset=utf-8";
request.GetRequestStream().Write(buf, 0, buf.Length);
using (var response = (HttpWebResponse)request.GetResponse())
{
var responseStream = response.GetResponseStream();
var streamReader = new StreamReader(responseStream, Encoding.UTF8);
var responseString = streamReader.ReadToEnd();
}
ターゲット・エンドポイントは、このようなものです:
public class MyObjectController : ApiController
{
public MyObject Post(MyObject myObject)
{
// myObject shows up null here
return myObject;
}
}
JSONの代わりに文字列を受け取るようにAPIを変更するとどうなりますか? –
2つの問題の1つになる可能性があります。 (1)フォーム本体がHTTPリクエストに含まれていないか、または(2)フォーム本体に内容がありますが、フォーム本体からMyObjectへのバインディング/マッピングが失敗している可能性があります。ログを確認して、これらのうちどれが起こっているのかを私たちに知らせてください。答えは非常に異なるからです。 –