Web API メソッドが呼び出されると、クライアントから HttpWebRequest が渡されることはわかっています (少なくともそうだと思います)。IOW、クライアントが次のようなものを送信して Web API メソッドを呼び出す場合:
192.168.125.50:28642/api/DeliveryItems/PostArgsAndXMLFileAsStr?serialNum=42&siteNum=99
...serialNum (42) と siteNum (99) の値を含む HttpWebRequest オブジェクトがメソッドに渡されます。
また、(現時点ではとにかく) 大量のデータを送信する必要がある場合 (serialNum と siteNum が例にあるように、URI の一部として渡すには多すぎる/多すぎる)、このデータを次のように埋め込むことができると考えています。クライアントの HttpWebRequest オブジェクトは次のようになります。
string data = "bla blee bloo blah foo bar doo dah";
WebRequest request = WebRequest.Create(uri);
. . .
byte[] arrData = Encoding.UTF8.GetBytes(data);
request.ContentLength = arrData.Length;
using (Stream oS = request.GetRequestStream())
{
oS.Write(arrData, 0, arrData.Length);
}
WebResponse response = request.GetResponse();
...そして、「[FromBody]」属性を使用して、他の(サーバー)エンドでデコードします。次のようになります。
public void PostArgsAndXMLFileAsStr([FromBody] string stringifiedXML, string serialNum, string siteNum)
{
XDocument doc = XDocument.Parse(stringifiedXML);
私の仮定は正しいですか?IOW、次のようなテスト コードの場合:
[Test]
public void TestNRBQDeliveryItemInterfacePostPPTData()
{
var DeliveryItem = IOC.container.Resolve<INRBQDeliveryItem>();
string data = @"<Command>
<DSD>
<line_id>1</line_id>
. . .
<discount>0.25</discount>
<fileDate>12/19/2013 1:33:27 PM</fileDate>
</DSD>
</Command>";
string uri = "http://localhost:21609/api/deliveryitems/InsertIntoPPTData";
WebRequest request = WebRequest.Create(uri);
request.Method = Enum.ToObject(typeof(HttpMethods), HttpMethods.POST).ToString();
request.ContentType = "application/json";
((HttpWebRequest)request).Accept = request.ContentType;
((HttpWebRequest)request).KeepAlive = false;
((HttpWebRequest)request).ProtocolVersion = HttpVersion.Version10;
Encoding encoding = Encoding.UTF8; // needed?
byte[] arrData = Encoding.UTF8.GetBytes(data);
request.ContentLength = arrData.Length;
using (Stream oS = request.GetRequestStream())
{
oS.Write(arrData, 0, arrData.Length);
}
// Send the request to the server by calling GetResponse. (http://msdn.microsoft.com/en-us/library/debx8sh9(v=vs.110).aspx)
WebResponse response = request.GetResponse();
Assert.IsNotNull(response);
}
...現在の Web API メソッドは次のようになります。
[HttpPost]
[Route("api/deliveryitems/InsertIntoPT109Data")]
public void InsertIntoPT109Data(HttpWebRequest httpwebreq)
{
HHSService.InsertIntoPPTData(httpwebreq);
}
...代わりに次のように変更します。
[HttpPost]
[Route("api/deliveryitems/InsertIntoPT109Data")]
public void InsertIntoPT109Data([FromBody] stringifiedXML)
{
HHSService.InsertIntoPT109Data(stringifiedXML);
}
?
わかりやすくするために、Web API メソッドへの引数として HttpWebRequest オブジェクトを使用することは、あまりにも露骨すぎると思います。送信される HttpWebRequest は「与えられた」ものであり、この場合に必要なのは「[FromBody] stringifiedXML」引数であり、[FromBody] データを私が与えた例のようなもので「アンパック」できることを願っています上記 (例: "XDocument doc = XDocument.Parse(stringifiedXML);")。
既存のコード (メソッドの引数として HttpWebRequest オブジェクトを明示的に渡す) または他のケース (HttpWebRequest オブジェクトがそこにあることが暗黙的にわかっていると仮定し、代わりに [FromBody] に埋め込まれたデータを処理する) のどちらかで正しいですか?それ)、またはどちらの場合も私は正しいですか?
最初の/現在のケース (HttpWebRequest オブジェクトを渡す必要がある) が正しい場合、HttpWebRequest オブジェクトに埋め込まれたデータを取得するにはどうすればよいですか? 「getResponseStream」を呼び出す必要がありますか、それとも...???
アップデート
HttpWebRequest の明示的な使用を控えることができれば、別の問題があります。これ:
void InsertIntoPT109Data([FromBody] stringifiedXML);
...「[FromBody]」属性が認識されないため、インターフェイス メソッドとしてコンパイルされません。それを「文字列」に置き換えるだけで十分でしょうか?
更新 2
次のように、「HttpWebRequest httpwebreq」を「[FromBody] String stringifiedXML」に置き換えました。
public void InsertIntoPT109Data([FromBody] String stringifiedXML)
...しかし、「型または名前空間名 'FromBody' が見つかりませんでした (using ディレクティブまたはアセンブリ参照がありませんか?)」というメッセージが表示されます。
「using System.Web.Http;」を追加したかどうかにかかわらず、これを取得します。か否か。
プロジェクト参照に DLL を追加する必要がある場合、それはどの DLL ですか?