在传递HttpWebRequest对象到Web API方法时,我是不是太明确了?

本文关键字:是不是 方法 HttpWebRequest 对象 API Web | 更新日期: 2023-09-27 18:11:56

我知道(至少我认为是这样),当一个Web API方法被调用时,一个HttpWebRequest是由客户端传递给它。现在,当客户端发送类似这样的内容来调用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);

我的假设正确吗?对于像这样的测试代码:

[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指令或程序集引用?)"

无论我是否添加了"using System.Web.Http;"我都会得到这个

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

在传递HttpWebRequest对象到Web API方法时,我是不是太明确了?

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

你的假设是不正确的

我认为@paul -morgado已经很好地涵盖了第一部分,没有什么要补充的了。

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

  1. 你需要给stringifiedXML(我假设string)一个类型,即使你使用[FromBody],和
  2. 你需要添加:
    using System.Web.Http;
    在您可以使用[FromBody]之前,在您的文件的顶部。有时人们会把它和"System.Web"混淆。