SharePoint 2010 Web Service的MultipleBaseAddressBasicHttpBindingServiceHostFactory或WebScriptServiceHostFactory?

Mic*_*tum 5 .net sharepoint wcf sharepoint-2010

在创建在SharePoint 2010上运行的新服务时,人们似乎通常使用Sharepoint MultipleBaseAddressBasicHttpBindingServiceHostFactory.

但是,我想使用标准的.net/WCF WebScriptServiceHostFactory,因为这通过使用/ js调用服务URL来为我提供JavaScript代码.

我的服务类本身仍然使用所需的属性进行修饰:

[BasicHttpBindingServiceMetadataExchangeEndpoint]
[AspNetCompatibilityRequirements(RequirementsMode =
         AspNetCompatibilityRequirementsMode.Required)]
[ServiceBehavior(Namespace = "http://mycompany/namespace")]
public class MyService : IMyServiceContract
Run Code Online (Sandbox Code Playgroud)

整个服务实际上工作正常,但我只是想知道真正的差异是什么?SharePoint ServiceHostFactory会给我什么?

kbr*_*ton 14

这是一个很好的问题!我的好奇心终于好起来了,我开始在Reflector中四处寻找.这不是权威的最终答案,但我认为你会对我学到的东西感兴趣.

首先:MultipleBaseAddressBasicHttpBindingServiceHostFactory简单地生成MultipleBaseAddressBasicHttpBindingServiceHost对象; WebScriptServiceHostFactory简单地生成WebScriptServiceHost对象.

两个主人都继承System.ServiceModel.ServiceHost,所以他们有一个健康的共同基础.幸运的是,这减少了我们必须检查以获得公平比较的代码占用空间的大小.

现在,虽然每个类中没有太多新代码,但它们会迅速向不同方向分支.看看OnOpening()实现.

WebScriptServiceHost我们有:

base.OnOpening();
WebServiceHost.AddAutomaticWebHttpBindingEndpoints(
    this,
    base.ImplementedContracts,
    SR2.GetString(SR2.JsonWebScriptServiceHostOneServiceContract, base.ImplementedContracts.Count));
foreach (ServiceEndpoint endpoint in base.Description.Endpoints)
{
    if (endpoint.Binding != null &&
        endpoint.Binding.CreateBindingElements().Find<WebMessageEncodingBindingElement>() != null &&
        endpoint.Behaviors.Find<WebHttpBehavior>() == null)
    {
        endpoint.Behaviors.Add(new WebScriptEnablingBehavior());
    }
}
Run Code Online (Sandbox Code Playgroud)

除非我弄错了,否则行读取endpoint.Behaviors.Add(new WebScriptEnablingBehavior());负责/js您想要的URL行为().

现在,在MultipleBaseAddressBasicHttpBindingServiceHost,我们有(缩写):

ClientServiceHost host = ClientServiceHost.CreateServiceHost();
this.CreateEndpoints();
base.OnOpening();
host.OnServiceHostOpeningInternal(this);
Run Code Online (Sandbox Code Playgroud)

之间的差异WebServiceHost.AddAutomaticWebHttpBindingEndpoints()this.CreateEndpoints()不十分清楚给我.我认为SharePoint主机包含对不同身份验证模型的更多自动配置支持.

ClientServiceHost.CreateServiceHost()是一种工厂方法,它ClientServiceHost根据web.config部分中列出的类型创建对象microsoft.sharepoint.client/serverRuntime.

OnServiceHostOpeningInternal()方法只是将调用转发给主机的OnServiceHostOpening()方法.查看默认安装的web.config,我们找到服务主机类型的程序集限定名称,我们可以从中检查该方法:

<serverRuntime>
  <hostTypes>
    <add type="Microsoft.SharePoint.Client.SPClientServiceHost, Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
  </hostTypes>
</serverRuntime>
Run Code Online (Sandbox Code Playgroud)

这是有趣的地方.该OnServiceHostOpening()方法如下所示:

[SharePointPermission(SecurityAction.Demand, ObjectModel=true)]
protected override void OnServiceHostOpening(ServiceHost serviceHost)
{
    if (serviceHost != null)
    {
        SPUtility.ConfigServiceHostIfClaimsAuth(serviceHost);
    }
}
Run Code Online (Sandbox Code Playgroud)

进一步深入研究,我们看到了围绕配置主机进行基于声明的身份验证的一系列逻辑.

啊哈!有一点值得注意.除非我弄错了,否则没有基于声明的身份验证支持WebScriptServiceHost.

结论

也许您没有使用基于声明的身份验证.如果是这样,您可能会发现使用WebScriptServiceHost很好.但是,如果我编写该服务,我将创建一个新的主机和主机工厂继承Microsoft类型,并查看是否可以使用创建/ js扩展endpoint.Behaviors.Add(new WebScriptEnablingBehavior().可能发生的最糟糕的事情是它不起作用.另一方面,如果它确实有效,您可以期望拥有一个支持终端首选项的高度SP兼容的服务主机工厂.

我希望这有帮助.