Как захотсить WCF SharePoint 2007? а точнее PSI extesion для ProjectServer2007 на WCF?
Оказалось не сложно, если вкратце, то:
Оказалось не сложно, если вкратце, то:
- Написать и установить свой VirtualPathProvider для svc
- Изменить web.config приложения для регистрации нового VirtualPathProvider
- Правильно разместить сервис
Теперь подробнее:
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 с параметрами сервиса
Комментариев нет:
Отправить комментарий