-1

我知道(至少我认为是这样),当调用 Web API 方法时,客户端会将 HttpWebRequest 传递给它。IOW,当客户端发送类似这样的内容来调用 Web API 方法时:

192.168.125.50:28642/api/DeliveryItems/PostArgsAndXMLFileAsStr?serialNum=42&siteNum=99

...一个包含 serialNum (42) 和 siteNum (99) 值的 HttpWebRequest 对象被传递给该方法。

我还认为(到目前为止,无论如何),如果需要发送大量数据(作为 URI 的一部分传递的太多/太多,例如示例中的 serialNum 和 siteNum),则可以将这些数据嵌入客户端上的 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);
}

?

为了更简单,我认为使用 HttpWebRequest 对象作为我的 Web API 方法的参数太明确了;我认为/希望发送的 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 指令或程序集引用?)”

我是否添加了“使用 System.Web.Http;” 或不。

如果我需要将 DLL 添加到项目引用中,它是哪个 DLL?

4

2 回答 2

2

/不发送到服务器或从服务器接收HttpWebRequestHttpWebResponse它们用于向服务器发送和接收数据。

你的假设是不正确的。

于 2014-07-08T02:31:22.607 回答
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 回答