我知道(至少我认为是这样),当调用 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?