在传递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
/HttpWebResponse
没有发送到服务器或从服务器接收。它们用于向服务器发送和接收数据。
你的假设是不正确的
我认为@paul -morgado已经很好地涵盖了第一部分,没有什么要补充的了。
关于你的FromBody
更新在你的帖子末尾,有两件事要注意:
- 你需要给
stringifiedXML
(我假设string
)一个类型,即使你使用[FromBody]
,和 - 你需要添加:
using System.Web.Http;
在您可以使用[FromBody]
之前,在您的文件的顶部。有时人们会把它和"System.Web"混淆。