Это отличный вопрос! Мое любопытство, наконец, одолело меня, и я начал ковыряться в 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());
}
}
Если я не ошибаюсь, строка, читающая endpoint.Behaviors.Add(new WebScriptEnablingBehavior());
, отвечает за поведение URL (/js
), которое вы хотите.
Теперь, в MultipleBaseAddressBasicHttpBindingServiceHost
, мы имеем (сокращенно):
ClientServiceHost host = ClientServiceHost.CreateServiceHost();
this.CreateEndpoints();
base.OnOpening();
host.OnServiceHostOpeningInternal(this);
Различия между 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>
Вот где это становится интересным. Метод OnServiceHostOpening()
выглядит следующим образом:
[SharePointPermission(SecurityAction.Demand, ObjectModel=true)]
protected override void OnServiceHostOpening(ServiceHost serviceHost)
{
if (serviceHost != null)
{
SPUtility.ConfigServiceHostIfClaimsAuth(serviceHost);
}
}
В дальнейшем, мы увидим метрическую лодку с логическим окружением, конфигурирующим хост для аутентификации на основе утверждений.
Aha! Есть разница, которую стоит отметить. Если я не ошибаюсь, в WebScriptServiceHost
.
нет поддержки аутентификации на основе утверждений.
* * Заключение тысячи сорок-девять
Возможно, вы не используете проверку подлинности на основе утверждений. Если это так, вы можете найти, что с помощью WebScriptServiceHost
хорошо. Однако, если бы я писал сервис, я бы создал новую фабрику хостов и хостов, наследующую типы Microsoft, и посмотрел, смогу ли я создать расширение / js, используя endpoint.Behaviors.Add(new WebScriptEnablingBehavior()
. Худшее, что может случиться, это то, что это не сработает. С другой стороны, если это сработает, вы можете рассчитывать на наличие фабрики хостов с высокой степенью SP-совместимости, которая поддерживает ваши предпочтения конечной точки.
Надеюсь, это поможет.