Relaying a request in asp.net (Forwarding a request)

后端 未结 5 2293
面向向阳花
面向向阳花 2020-12-07 16:04

I have a web application that communicates between two different web applications (one receiver and one sender, the sender communicates with my application, and my applicati

5条回答
  •  鱼传尺愫
    2020-12-07 17:00

    Here's some good relay code in VB.NET using MVC.

    GLOBAL.ASAX.VB

    Public Class MvcApplication
        Inherits System.Web.HttpApplication
    
        Shared Sub RegisterRoutes(ByVal routes As RouteCollection)
            routes.MapRoute("Default", "{*s}", New With {.controller = "Home", .action = "Index"})
        End Sub
    
        Sub Application_Start()
            RegisterRoutes(RouteTable.Routes)
        End Sub
    End Class
    

    HomeController.vb

    Option Explicit On
    Option Strict On
    
    Imports System.Net
    
     _
    Public Class HomeController
        Inherits System.Web.Mvc.Controller
    
        Function Index(ByVal s As String) As ActionResult
            Server.ScriptTimeout = 60 * 60
            If Request.QueryString.ToString <> "" Then s = s + "?" + Request.QueryString.ToString
            Dim req As HttpWebRequest = CType(WebRequest.Create("http://stackoverflow.com/" + s), HttpWebRequest)
            req.AllowAutoRedirect = False
            req.Method = Request.HttpMethod
            req.Accept = Request.Headers("Accept")
            req.Referer = Request.Headers("Referer")
            req.UserAgent = Request.UserAgent
            For Each h In Request.Headers.AllKeys
                If Not (New String() {"Connection", "Accept", "Host", "User-Agent", "Referer"}).Contains(h) Then
                    req.Headers.Add(h, Request.Headers(h))
                End If
            Next
            If Request.HttpMethod <> "GET" Then
                Using st = req.GetRequestStream
                    StreamCopy(Request.InputStream, st)
                End Using
            End If
            Dim resp As WebResponse = Nothing
            Try
                Try
                    resp = req.GetResponse()
                Catch ex As WebException
                    resp = ex.Response
                End Try
    
                If resp IsNot Nothing Then
                    Response.StatusCode = CType(resp, HttpWebResponse).StatusCode
                    For Each h In resp.Headers.AllKeys
                        If Not (New String() {"Content-Type"}).Contains(h) Then
                            Response.AddHeader(h, resp.Headers(h))
                        End If
                    Next
                    Response.ContentType = resp.ContentType
    
                    Using st = resp.GetResponseStream
                        StreamCopy(st, Response.OutputStream)
                    End Using
                End If
            Finally
                If resp IsNot Nothing Then resp.Close()
            End Try
            Return Nothing
        End Function
        Sub StreamCopy(ByVal input As IO.Stream, ByVal output As IO.Stream)
            Dim buf(0 To 16383) As Byte
            Using br = New IO.BinaryReader(input)
                Using bw = New IO.BinaryWriter(output)
                    Do
                        Dim rb = br.Read(buf, 0, buf.Length)
                        If rb = 0 Then Exit Do
                        bw.Write(buf, 0, rb)
                    Loop
                End Using
            End Using
        End Sub
    End Class
    

提交回复
热议问题