0

私のプロジェクトにはリアルタイムのユーザーインタラクションが必要であり、SignalRが私のニーズを解決すると思います。私は技術的にはSharePoint2007プロジェクトに取り組んでいますが、専らアプリケーションページを使用しているため、SharePointをほとんど使用していません。とにかく、私はIISの2.0フレームワークアプリプールで立ち往生しています。

私の最初のアプローチは、サブサイトとして4.0アプリケーションを作成することでした。残念ながら、それは惨めに失敗しました。このアプローチはSharePoint以外の世界でも機能しますが、SharePointが要求パイプラインの多くを乗っ取って、このアプローチが機能しないようです。

そのため、4.0である別のIISサイトを作成し、IIS書き換えルールを使用して、特定のサブディレクトリ(/ realtime /)がローカルであり、別のサイトではないとアプリを偽造して、クロスドメインリクエストの問題に対処します。問題は、IISの書き換えルールを取得して別のhttpホストに書き換えることができないことです(例:http ://www.mySharepoint.com/_layouts/MySite/realtime/Hello.aspxからhttp://realtime.mySharePoint.com/Hello .aspx)。

アプローチ#1またはアプローチ#2、あるいは代替案についての助けをいただければ幸いです。

4

2 に答える 2

1

これが私がしたことです...signalR.net4.0を使用するWebアプリ、次にSharePoint Web App.net2。

  1. これをSignallrプロジェクトのglobal.asaxに追加します

    RouteTable.Routes.MapHttpHandlerRoute("spproxy","spproxy/{*operation}", new SharePointRProxyHandler());
    
  2. SharePointからイベントを発生させる場合は、たとえば、この新しいルートURLに対してhttpPOSTを実行できます。

     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から要求を取得し、シグナルコードを実行している.net4.0アプリケーションに渡すこともできます。

httpハンドラーの使用例は次の場所にあります:http://spmatt.wordpress.com/2012/04/12/harnessing-signalr-in-sharepoint/

于 2013-04-15T17:14:00.277 に答える