伪造HttpRequest

时间:2016-07-11 13:47:46

标签: c# httprequest

我的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?

0 个答案:

没有答案