如何:为外部应用程序创建 HTTP 请求转发器

本主题介绍如何创建一个转发 HTTP 请求处理程序的请求。

上次修改时间: 2010年1月13日

适用范围: SharePoint Foundation 2010

某些应用程序(如 Silverlight)无法进行跨域请求。当应用程序需要与另一个域中的服务器通信时,系统必须首先将其请求发送到请求转发处理程序(当然,该处理程序与应用程序位于同一域中)。该处理程序然后会重新打包此请求并将其发送到外部域中的目标服务器。

如果 Silverlight Web 部件承载的 Silverlight 应用程序所在的域与其页面包含 Web 部件的 SharePoint Foundation Web 应用程序所在的域不同,并且该 Silverlight 应用程序需要向 Web 应用程序发送请求,则必须在 Silverlight 应用程序所在的域中创建并安装请求转发处理程序。在向页面中添加 Web 部件后,会在外部应用程序 XML 中指定该处理程序的 URL。有关创建此 XML 的详细信息,请参阅如何:创建外部应用程序 XML 标记

该处理程序所需的大部分逻辑包含在 RequestForwarder 类中。您所创建的处理程序类是对此类进行的一种包装。

创建请求转发处理程序

  1. 在您的 Visual Studio 项目中添加一个纯文本文件,并为其指定 .ashx 扩展名。

  2. 在页的顶端添加一个 WebHandler 指令。使用 Language 和 Class 属性指定实现该处理程序的编程语言和类。下面是一个示例。

    <%@ WebHandler Language="C#" Class="ToSharePointForwarder" %>
    
  3. 在该指令的下方正确添加代码,就像在普通代码文件中添加代码一样。首先添加 using 语句,并为 Microsoft.SharePoint.Client 命名空间添加该语句。

    using System;
    using System.Web;
    using Microsoft.SharePoint.Client;
    
    Imports System
    Imports System.Web
    Imports Microsoft.SharePoint.Client
    
  4. 为处理程序类添加声明。由于它是一个 HTTP 处理程序,因此它必须实现 IHttpHandler 接口。

    public class ToSharePointForwarder : IHttpHandler 
    {    
    }
    
    Public Class ToSharePointForwarder
            Implements IHttpHandler
    End Class
    
  5. 添加 IsReusable 属性的实现。它应仅返回 false。

    public bool IsReusable 
    {
        get { return false; }
    }
    
    Public ReadOnly Property IsReusable() As Boolean
            Get
                    Return False
            End Get
    End Property
    
  6. 添加 ProcessRequest(HttpContext) 方法的实现。在很大程度上,实现只是对 RequestForwarder 类的 ProcessRequest() 方法进行的包装。但是,您必须首先将应用程序主体凭据添加到请求中。在此示例中,通过应用程序主体用户的登录名和密码以及该用户的 Active Directory 域来构造 NetworkCredential

    public void ProcessRequest (HttpContext context) 
    {
        RequestForwarder forwarder = new RequestForwarder(context);
        if (!String.IsNullOrEmpty(forwarder.Url))
        {        forwarder.WebRequest.Credentials = new System.Net.NetworkCredential("ContosoSilverlightApp", "&Tu*)2v", "Contoso");
            forwarder.ProcessRequest();
        }
    }
    
    Public Sub ProcessRequest(ByVal context As HttpContext)
        Dim forwarder As New RequestForwarder(context)
        If Not String.IsNullOrEmpty(forwarder.Url) Then
            forwarder.WebRequest.Credentials = New System.Net.NetworkCredential("ContosoSilverlightApp", "&Tu*)2v", "Contoso")
            forwarder.ProcessRequest()
        End If
    End Sub