我如何复制一个HttpRequest到另一个web服务

本文关键字:服务 HttpRequest 另一个 一个 web 何复制 复制 | 更新日期: 2023-09-27 18:16:07

为了测试的目的,我在同一台PC上安装了两个相同的web服务。第一个服务接收到的请求也应该发送给第二个服务。我的意图是使用HttpModule来做到这一点。我在application.BeginRequest期间处理请求。

public void AsyncForwardRequest(HttpRequest request)
{
    try
    {
        // Prepare web request...
        HttpWebRequest req = (HttpWebRequest)WebRequest.Create(WSaddress);
        req.Credentials = CredentialCache.DefaultCredentials;
        req.Headers.Add("SOAPAction", request.Headers["SOAPAction"]);
        req.ContentType = request.Headers["Content-Type"];
        req.Accept = request.Headers["Accept"];
        req.Method = request.HttpMethod;
        // Send the data.
        long posStream = request.InputStream.Position;
        long len = request.InputStream.Length;
        byte[] buff = new byte[len];
        request.InputStream.Seek(0, SeekOrigin.Begin);
        if (len < int.MaxValue && request.InputStream.Read(buff, 0, (int)len) > 0)
        {
            using (Stream stm = req.GetRequestStream())
            {
                stm.Write(buff, 0, (int)len);
            }
            request.InputStream.Position = posStream;
            DebugOutputStream(request.InputStream);
            request.InputStream.Seek(0, SeekOrigin.Begin);
            IAsyncResult result = (IAsyncResult)req.BeginGetResponse(new AsyncCallback(RespCallback), req);
        }
    }
    catch (Exception ex)
    {
        App.Error2(String.Format("RequestDuplicatorModule - BeginRequest; ERROR begin request: {0}", ex.Message), ex);
    }
private static void RespCallback(IAsyncResult asynchronousResult)
{
    try
    {
        // State of request is asynchronous.
        var req = (HttpWebRequest)asynchronousResult.AsyncState;
        WebResponse resp = (HttpWebResponse)req.EndGetResponse(asynchronousResult);
        Stream responseStream = resp.GetResponseStream();
        System.IO.Stream stream = responseStream;
        Byte[] arr = new Byte[1024 * 100];
        stream.Read(arr, 0, 1024 * 100);
        if (arr.Length > 0)
        {
            string body = (new ASCIIEncoding()).GetString(arr);
            Debug.Print(body);
        }
    }
    catch (WebException ex)
    {
        App.Error2(String.Format("RequestDuplicatorModule - BeginRequest; ERROR begin request: {0}", ex.Message), ex);
    }
}

This (HttpWebResponse)req.EndGetResponse(asynchronousResult)抛出一个异常:500 Internal Server Error并失败。

请求。InnerStream:…

这是否与web服务地址不同有关?就我而言,它们是:http://localhost/WS/service.asmxhttp://localhost/WS_replicate/service.asmx

我如何复制一个HttpRequest到另一个web服务

我至少会实现这一点,能够读取一个状态为500的httpwebrequest的内容:

catch (WebException ex)
{
    HttpWebResponse webResponse = (HttpWebResponse)ex.Response;
    Stream dataStream = webResponse.GetResponseStream();
    if (dataStream != null)
    {
        StreamReader reader = new StreamReader(dataStream);
        response = reader.ReadToEnd();
    }
}

没有回答你的问题,我建议有一个简单的amsx读取请求,并将请求发布到两个不同的web服务。如果你需要一些代码,请告诉我。

附加的优点是,对于开发人员和处理部署的开发人员来说,asmx将更容易得到支持。您可以添加配置选项,使实际url的动态

能够修改AsyncForwardRequest方法,以便我可以实际编辑SoapEnvelope本身:

string buffString = System.Text.UTF8Encoding.UTF8.GetString(buff);
using (Stream stm = req.GetRequestStream())
{
    bool stmIsReadable = stm.CanRead;  //false, stream is not readable, how to get
                                       //around this?
                                       //solution: read Byte Array into a String,
                                       //modify <wsa:to>, write String back into a
                                       //Buffer, write Buffer to Stream
    buffString = buffString.Replace("http://localhost/WS/Service.asmx", WSaddress);
    //write modded string to buff
    buff = System.Text.UTF8Encoding.UTF8.GetBytes(buffString);
    stm.Write(buff, 0, (int)buff.Length);
}