c# - 如何将 HttpRequest 复制到另一个 Web 服务?

标签 c# asp.net web-services httpwebrequest web

出于测试目的,我目前在同一台 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);
    }

}

此 (HttpWebResponse)req.EndGetResponse(asynchronousResult) 抛出异常:500 Internal Server Error 并失败。原始请求顺利通过。

请求.InnerStream: ...

这与网络服务地址不同有什么关系吗?就我而言,它们是: http://localhost/WS/service.asmx http://localhost/WS_replicate/service.asmx

最佳答案

我至少会实现这个,以便能够读取状态为 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 动态化。

关于c# - 如何将 HttpRequest 复制到另一个 Web 服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8325679/

相关文章:

c# - 发送到多个电子邮件地址时,ASP.NET C# 电子邮件附件最终变为 0 字节

c# - 领域类应该如何设计?

C# label AutoSize 添加padding

asp.net - 使用 SignalR 在多个 Web 应用程序之间进行通信

c# - 如何在 .net 中添加对 "Microsoft.Office.Interop.Word"的引用

macos - 在 Macos 上模拟 REST Web 服务

web-services - 如果 SPF 记录限定符包含在另一个 SPF 记录中,如果父记录比子记录更严格,对 SPF 记录限定符有什么影响?

javascript - 通过 JS 使用 Azure ML Web 服务

c# - 如何通过 WebHttpBinding 接收数组?

c# - 如何将组合框绑定(bind)到 WPF 中的多语言值集合?