我知道(至少我认为是这样),当调用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”代替那个就足够了吗?
我用“[FromBody] String stringifiedXML”替换了“HttpWebRequest httpwebreq”,例如:
public void InsertIntoPT109Data([FromBody] String stringifiedXML)
...但现在我知道,“找不到类型或命名空间名称'FromBody'(你是否缺少using指令或汇编引用?)”
我是否添加了“using System.Web.Http;”或不。
如果我需要在项目引用中添加DLL,它是哪个DLL?
答案 0 :(得分:2)
HttpWebRequest
/ HttpWebResponse
不会发送到服务器或从服务器接收。它们用于向服务器发送和接收数据。
您的假设不正确。
答案 1 :(得分:1)
我认为@ paulo-morgado很好地涵盖了第一部分,我没有进一步补充。
关于帖子末尾的FromBody
更新,需要注意两件事:
stringifiedXML
,string
提供类型(我假设为[FromBody]
)
using System.Web.Http;
[FromBody]
之前,在文件顶部。有时人们会将其与“System.Web.Mvc”混淆,后者是特定于MVC项目而不是Web API。