我是否过于明确地将HttpWebRequest对象传递给Web API方法?

时间:2014-07-07 22:20:09

标签: c# asp.net-web-api httpwebrequest getresponsestream frombodyattribute

我知道(至少我认为是这样),当调用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对象作为方法的arg)或其他情况(我假设隐含地知道HttpWebRequest对象在那里,而是处理[FromBody])嵌入其中的数据),或者两种情况下我是对的吗?

如果我在第一个/当前情况下是正确的(我必须传递一个HttpWebRequest对象),我怎样才能获得HttpWebRequest对象中的嵌入数据?我需要调用“getResponseStream”或...... ???

更新

如果我能够放弃HttpWebRequest的明确使用,那么还有另一个问题。这样:

void InsertIntoPT109Data([FromBody] stringifiedXML);

...不编译为接口方法,因为无法识别“[FromBody]”属性。用“String”代替那个就足够了吗?

更新2

我用“[FromBody] String stringifiedXML”替换了“HttpWebRequest httpwebreq”,例如:

public void InsertIntoPT109Data([FromBody] String stringifiedXML)

...但现在我知道,“找不到类型或命名空间名称'FromBody'(你是否缺少using指令或汇编引用?)”

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

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

2 个答案:

答案 0 :(得分:2)

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

您的假设不正确。

答案 1 :(得分:1)

我认为@ paulo-morgado很好地涵盖了第一部分,我没有进一步补充。

关于帖子末尾的FromBody更新,需要注意两件事:

  1. 即使您使用stringifiedXML
  2. 也需要为string提供类型(我假设为[FromBody]
  3. 您需要添加:
    using System.Web.Http;
    在您可以使用[FromBody]之前,在文件顶部。有时人们会将其与“System.Web.Mvc”混淆,后者是特定于MVC项目而不是Web API。