MultipleBaseAddressBasicHttpBindingServiceHostFactory или WebScriptServiceHostFactory для веб-службы SharePoint 2010? - PullRequest
5 голосов
/ 31 июля 2010

Когда дело доходит до создания новой Службы, работающей в SharePoint 2010, люди обычно используют Sharepoint MultipleBaseAddressBasicHttpBindingServiceHostFactory .

Однако я хотел бы использовать стандарт .net / WCF WebScriptServiceHostFactory вместо этого, потому что это дает мне код JavaScript, вызывая URL-адрес службы с /js.

Мой класс обслуживания все еще украшен необходимыми атрибутами:

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

Весь Сервис на самом деле работает нормально, но мне просто интересно, каковы реальные различия?Что бы мне дал SharePoint ServiceHostFactory?

1 Ответ

14 голосов
/ 09 августа 2010

Это отличный вопрос! Мое любопытство, наконец, одолело меня, и я начал ковыряться в 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-совместимости, которая поддерживает ваши предпочтения конечной точки.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...