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