-1

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 ですか?

4

2 に答える 2

1

I think @paulo-morgado covered the first part well, nothing further for me to add.

Regarding your FromBody update at the end of your post, two things to note:

  1. you need to give a type to stringifiedXML (I assume string) even if you use [FromBody], and
  2. you need to add:
    using System.Web.Http;
    at the top of your file before you can use [FromBody]. Sometimes people confuse that with "System.Web.Mvc" which is specific to MVC projects and not Web API.
于 2014-07-08T14:27:51.083 に答える