0

我的项目需要实时用户交互,我认为 SignalR 将解决我的需求。我在技术上是在 SharePoint 2007 项目中,虽然我只在应用程序页面中,因此几乎不使用 SharePoint。无论如何,我被困在 IIS 中的 2.0 框架应用程序池中。

我的第一种方法是尝试创建一个 4.0 应用程序作为子站点。不幸的是,这惨遭失败。这种方法适用于非 SharePoint 世界,但似乎 SharePoint 劫持了太多的请求管道,以使这种方法对我有用。

所以现在我正在创建一个单独的 IIS 站点,它是 4.0,并使用 IIS 重写规则来伪造我的应用程序,使其认为特定的子目录 (/realtime/) 是本地的而不是单独的站点,所以我没有处理跨域请求问题。问题是我无法让 IIS 重写规则重写到另一个 http 主机(例如http://www.mySharepoint.com/_layouts/MySite/realtime/Hello.aspxhttp://realtime.mySharePoint.com/Hello .aspx)。

对于方法#1 或方法#2 或任何替代想法的任何帮助将不胜感激。

4

2 回答 2

1

这就是我所做的...带有signalR .net4.0的Web App,然后是您的SharePoint Web App .net 2。

  1. 将此添加到 Signalr 项目中的 global.asax

    RouteTable.Routes.MapHttpHandlerRoute("spproxy","spproxy/{*operation}", new SharePointRProxyHandler());
    
  2. 例如,如果您想从 SharePoint 引发事件,您可以对这个新路由 URL 执行 http POST

     http://localhost:38262/spproxy
    

    它会将任何发布的数据传递到下面的 httphandler,然后将其广播给您的客户。

这是 MapHttpHandlerRoute 的代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace System.Web.Routing
{
public class HttpHandlerRoute : IRouteHandler
{
    private String _virtualPath = null;
    private IHttpHandler _handler = null;

    public HttpHandlerRoute(String virtualPath)
    {
        _virtualPath = virtualPath;
    }

    public HttpHandlerRoute(IHttpHandler handler)
    {
        _handler = handler;
    }

    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        IHttpHandler result;
        if (_handler == null)
        {
            result = (IHttpHandler)System.Web.Compilation.BuildManager.CreateInstanceFromVirtualPath(_virtualPath, typeof(IHttpHandler));
        }
        else
        {
            result = _handler;
        }
        return result;
    }
}

public static class RoutingExtensions
{
    public static void MapHttpHandlerRoute(this RouteCollection routes, string routeName, string routeUrl, string physicalFile, RouteValueDictionary defaults = null, RouteValueDictionary constraints = null)
    {
        var route = new Route(routeUrl, defaults, constraints, new HttpHandlerRoute(physicalFile));
        RouteTable.Routes.Add(routeName, route);
    }

    public static void MapHttpHandlerRoute(this RouteCollection routes, string routeName, string routeUrl, IHttpHandler handler, RouteValueDictionary defaults = null, RouteValueDictionary constraints = null)
    {
        var route = new Route(routeUrl, defaults, constraints, new HttpHandlerRoute(handler));
        RouteTable.Routes.Add(routeName, route);
    }
}
}

或者您可以直接发布到 httphandler 并让处理程序进行连接。广播

namespace SharePointRProxy
{
 /// <summary>
 /// Summary description for SharePointRProxyHandler
 /// </summary>
 public class SharePointRProxyHandler : IHttpHandler
 {

     public void ProcessRequest(HttpContext context)
     {
         context.Response.ContentType = "text/plain";
         IConnectionManager connectonManager = AspNetHost.DependencyResolver.Resolve<IConnectionManager>();
         IConnection connection = connectonManager.GetConnection<MyConnection>();

         object payload = null; //Add payload here 'context.Request.Params["data"] ?'

         JavaScriptSerializer jss = new JavaScriptSerializer();
         var payloadJSON = jss.Serialize(payload);

         connection.Broadcast(payloadJSON);
     }

     public bool IsReusable
     {
         get
         {
             return false;
         }
     }
 }
}
于 2012-05-17T02:00:29.613 回答
0

您还可以使用调用 .net 4.0 Web 服务的事件处理程序或 http 处理程序从 SharePoint 获取请求并将它们传递给运行信号器代码的 .net 4.0 应用程序。

您可以在此处查看使用 http 处理程序的示例:http: //spmatt.wordpress.com/2012/04/12/harnessing-signalr-in-sharepoint/

于 2013-04-15T17:14:00.277 回答