среда, 20 апреля 2011 г.

SharePoint 2007 и WCF

Как захотсить WCF SharePoint 2007? а точнее PSI extesion для ProjectServer2007 на WCF?
Оказалось не сложно, если вкратце, то:

  1. Написать и установить свой VirtualPathProvider для svc
  2. Изменить web.config приложения для регистрации нового VirtualPathProvider 
  3. Правильно разместить сервис
Теперь подробнее:
1. По этому поводу есть куча статей нам понадобиться собственно провайдер и класс регистрации. Это провайдер:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Hosting;
namespace WCFSupport
{
    public class WCFVirtualPathProvider : VirtualPathProvider
    {
        public override string CombineVirtualPaths(string basePath, string relativePath)
        {
            return Previous.CombineVirtualPaths(basePath, relativePath);
        }
        public override System.Runtime.Remoting.ObjRef CreateObjRef(Type requestedType)
        {
            return Previous.CreateObjRef(requestedType);
        }
        public override bool DirectoryExists(string virtualDir)
        {
            return Previous.DirectoryExists(virtualDir);
        }
        // all other methods omited, they simply call Previous... like the above.
        public override bool FileExists(string virtualPath)
        {
            string fixedVirtualPath = virtualPath;
            if (virtualPath.StartsWith("~") && virtualPath.EndsWith(".svc"))
            {
                fixedVirtualPath = virtualPath.Remove(0, 1);
            }
            return Previous.FileExists(fixedVirtualPath);
        }
        public override System.Web.Caching.CacheDependency GetCacheDependency(string virtualPath,
               System.Collections.IEnumerable virtualPathDependencies, DateTime utcStart)
        {
            return Previous.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart);
        }
        public override string GetCacheKey(string virtualPath)
        {
            return Previous.GetCacheKey(virtualPath);
        }
        public override VirtualDirectory GetDirectory(string virtualDir)
        {
            return Previous.GetDirectory(virtualDir);
        }
        public override VirtualFile GetFile(string virtualPath)
        {
            return Previous.GetFile(virtualPath);
        }
        public override string GetFileHash(string virtualPath, System.Collections.IEnumerable virtualPathDependencies)
        {
            return Previous.GetFileHash(virtualPath, virtualPathDependencies);
        }
        protected override void Initialize()
        {
            base.Initialize();
        }
    }
}
Это регистратор:
namespace WCFSupport
{
    public class WCFVPPRegModule : IHttpModule
    {
        static bool wcfProviderInitialized = false;
        static object locker = new object();
        public void Init(HttpApplication context)
        {
            if (!wcfProviderInitialized)
            {
                lock (locker)
                {
                    if (!wcfProviderInitialized)
                    {
                        WCFVirtualPathProvider wcfVPP = new WCFVirtualPathProvider();
                        HostingEnvironment.RegisterVirtualPathProvider(wcfVPP);
                        wcfProviderInitialized = true;
                    }
                }
            }
        }
        public void Dispose()
        {
        }
    }
}
2. В web.config (C:\Inetpub\wwwroot\wss\VirtualDirectories\app\web.config) в секцию  добавить сборку, будет что то типа:
     

3. Что бы зацепить SPContext надо разместить в одной из 2-х папок
  • "C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\ISAPI\" 
  • "C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\LAYOUTS\" 
Я создал паку в ISAPI: ISAPI\PSI\MyService\"
Туда поместил 2 файла:
MyService.svc:
<%@ Assembly Name="MyService, Version=1.0.0.0, Culture=neutral, PublicKeyToken=xxxx"%>  
<%@ ServiceHost Service="MyService.Service" %>
web.config с параметрами сервиса

Комментариев нет:

Отправить комментарий