我的Web应用程序有一个HttpHandler,它通过HTTP POST接收一些XML(请求消息),它会对它执行某些操作,然后返回一些其他XML(响应消息)。但是,向我发送XML的一方现在坚持要求他们通过SOAP代替HTTP POST。它成为SOAP的事实并不是很重要,它只是在初始有效负载周围添加了一些标签。让我们接收数据,将消息转换回之前的状态,并将其传递给原始的HttpHandler ...
首先,我以前在HttpHandler中获得的消息就像
<placeorder>
<products>
<product>123</product>
<product>123</product>
</products>
</placeorder>
现在,我在SoapService中收到的消息就像
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header/>
<soapenv:Body>
<placeorder>
<products>
<product>123</product>
<product>123</product>
</products>
</placeorder>
</soapenv:Body>
</soapenv:Envelope>
为了不改变太多的代码,我想到只在SoapService asmx中编写方法placeorder
,它有一个参数products
。它将假冒HttpRequest并将其传递给我原来的HttpHandler。
public class SoapService : WebService
{
[WebMethod]
public XmlDocument placeorder(XmlDocument products)
{
var hrq = new HttpRequest(null, "http://dummy/dummy", null);
var requestString = "<placeorder><products>";
requestString += products.DocumentElement.OuterXml;
requestString += "</products></placeorder>";
/* this line is failing */ hrq.InputStream.Write(Encoding.UTF8.GetBytes(requestString), 0, requestString.Length);
var ms = new MemoryStream();
var sw = new StreamWriter(ms);
var hrs = new HttpResponse(sw);
var hc = new HttpContext(hrq, hrs);
var mhh = new MyHttpHandler();
mhh.ProcessRequest(hc); // finally execute my original code
var responseString = hc.Response.OutputStream.ToString();
var externalResponse = new XmlDocument();
externalResponse.LoadXml(responseString);
return externalResponse;
}
}
除了将有效负载(requestString)写入伪造的HttpRequest的InputStream之外,这一切都有效。该流不支持写入它。 BUt我也无法在构造HttpRequest时设置流。我不能使用另一个流来替换它,因为该属性是只读的。
那么如何完成设置创建HttpRequest的InputStream?