Как избавиться от tempuri.org в службе WCF, созданной SharePoint Service Factory - PullRequest
3 голосов
/ 06 октября 2010

Я представляю службу WCF в SharePoint 2010 с использованием класса Service Factory и не могу полностью избавиться от пространства имен tempuri.org в сгенерированном WSDL.

Вот что я делаю:

Файл SVC в папке ISAPI

<%@ServiceHost
    Language="C#"
    Factory="Microsoft.SharePoint.Client.Services.MultipleBaseAddressBasicHttpBindingServiceHostFactory, Microsoft.SharePoint.Client.ServerRuntime, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"
    Service="MyService, [...]"   
%>

Договор на обслуживание

using System.ServiceModel;

    namespace MyService
    {
        [ServiceContract(Namespace="http://myname.com")]
        interface IMyService
        {
            [OperationContract]
            string GetSomeDefinition();
        }
    }

Служба реализации

using System;
using System.ServiceModel;
using System.ServiceModel.Activation;
using Microsoft.SharePoint.Client.Services;

    namespace MyService
    {
        [ServiceBehavior(Namespace = "http://myname.com")]
        [BasicHttpBindingServiceMetadataExchangeEndpointAttribute]
        [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
        class MyService : IMyService
        {
            public string GetSomeDefinition()
            {
                // do some stuff...
                return result;
            }
        }
    }

WSDL

<wsdl:definitions name="MyService" targetNamespace="http://myname.com" [...]>
  <wsdl:import namespace="http://tempuri.org/" location="http://localhost/_vti_bin/myservice.svc/mex?wsdl=wsdl0" /> 
  [...]
</wsdl:definitions>

Проблема в том, что WSDL разделен на две части. Один с правильным новым пространством имен http://myname.com и один с пространством имен по умолчанию http://tempuri.org. Обычно вы избавляетесь от него, используя атрибут bindingNamespace в конфигурации конечной точки. Но поскольку я использую Service Factory, я не могу этого сделать. Попытка определить конечную точку службы в web.config завершается неудачно со следующей ошибкой: экземпляр привязки уже был связан для прослушивания http://localhost/...

Блок Web.config

  <system.serviceModel>
    <services>
      <service name="MyService.MyService">
        <endpoint address="http://localhost/_vti_bin/myservice.svc" binding="basicHttpBinding" contract="MyService.IMyService" bindingNamespace="http://myname.com" />
      </service>
    </services>
  </system.serviceModel>

2010-10-07 Обновление: Я попытался получить MultipleBaseAddressBasicHttpBindingServiceHostFactory и добавить пространство имен привязки конечной точки при создании ServiceHost. Это не удается, потому что коллекция конечных точек на данный момент пуста.

Ответы [ 2 ]

2 голосов
/ 10 октября 2010

В общем случае вам нужно явно указать пространство имен, чтобы избавиться от значения по умолчанию для tempuri.org, в трех местах:

  • атрибут ServiceContract (по контракту)
  • Атрибут ServiceBehavior (при реализации)
  • bindingNamespace для соответствующей службыэлементы в файле конфигурации.

    - larsw

0 голосов
/ 15 декабря 2015

Я столкнулся с точно такой же проблемой и смог ее решить благодаря этому посту от Камерона Верхелста: http://cameron -verhelst.be / blog / 2014/10/19 / hosting-a-wcf-service-in -sharepoint-with-a-spcontext / (Большое ему спасибо!)

Потребитель моей службы не хотел, чтобы WSDL был составным, поэтому мне пришлось правильно настроить пространства имен моей службы.

Ключ заключается в том, чтобы создать свой собственный узел службы и фабрику узла службы, чтобы изменять автоматически созданные конечные точки узлом службы и ссылаться на него в файле svc.

Вот мой:

CustomMultipleBaseAddressBasicHttpBindingServiceHostFactory.cs

using System;
using System.ServiceModel;
using Microsoft.SharePoint.Client.Services;

public class CustomMultipleBaseAddressBasicHttpBindingServiceHostFactory : MultipleBaseAddressBasicHttpBindingServiceHostFactory
{
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
    {
        return new CustomMultipleBaseAddressBasicHttpBindingServiceHost(serviceType, baseAddresses);
    }
}

CustomMultipleBaseAddressBasicHttpBindingServiceHostFactory.cs

using System;
using System.Linq;
using System.ServiceModel.Description;
using Microsoft.SharePoint.Client.Services;

public class CustomMultipleBaseAddressBasicHttpBindingServiceHost : MultipleBaseAddressBasicHttpBindingServiceHost
{
    public CustomMultipleBaseAddressBasicHttpBindingServiceHost(Type serviceType, params Uri[] baseAddresses)
        : base(serviceType, baseAddresses)
    {
    }

    protected override void OnOpening()
    {
        base.OnOpening();

        string targetNamespace = ImplementedContracts.First().Value.Namespace;

        foreach (ServiceEndpoint endpoint in Description.Endpoints)
        {
            endpoint.Binding.Namespace = targetNamespace;
        }
    }
}

Этот хост службы позволяет принудительно заставить целевое пространство имен конечной точки совпадать с указанным контрактом.

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