Служба wcf не может быть активирована
Это .svc служба IIS с поддержкой ssl и членством.
Мои отчеты клиента wcf:
System.ServiceModel.ServiceActivationException was unhandled
Message="The requested service, 'https://www.greenjump.nl/WebServices/OrderService.svc' could not be activated. See the server diagnostic trace logs for more information."
Source="mscorlib"
На сервере я получаю:
System.ArgumentException Эта коллекция уже содержит адрес со схемой http. В этой коллекции может быть не более одного адреса по схеме. Имя параметра: item
Странное дело, что это происходит только на производственном сервере, тот же код и конфигурация
на сервере разработки localhost отлично работает.
Я только меняю адрес конечной точки и
от имени компьютера до www.webdomain.com
больше трассировки сервера
<ExceptionType>
System.ArgumentException, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
</ExceptionType>
<Message>
This collection already contains an address with scheme http. There can be at most one address per scheme in this collection.
Parameter name: item
</Message>
<StackTrace>
at System.ServiceModel.UriSchemeKeyedCollection.InsertItem(Int32 index, Uri item)
at System.Collections.Generic.SynchronizedCollection`1.Add(T item)
at System.ServiceModel.UriSchemeKeyedCollection..ctor(Uri[] addresses)
at System.ServiceModel.ServiceHost..ctor(Type serviceType, Uri[] baseAddresses)
at SharpShop.Web.StructureMap.StructureMapServiceHost..ctor(Type serviceType, Uri[] baseAddresses)
at SharpShop.Web.StructureMap.StructureMapServiceHostFactory.CreateServiceHost(Type serviceType, Uri[] baseAddresses)
at System.ServiceModel.Activation.ServiceHostFactory.CreateServiceHost(String constructorString, Uri[] baseAddresses)
at System.ServiceModel.ServiceHostingEnvironment.HostingManager.CreateService(String normalizedVirtualPath)
at System.ServiceModel.ServiceHostingEnvironment.HostingManager.ActivateService(String normalizedVirtualPath)
at System.ServiceModel.ServiceHostingEnvironment.HostingManager.EnsureServiceAvailable(String normalizedVirtualPath)
at System.ServiceModel.ServiceHostingEnvironment.EnsureServiceAvailableFast(String relativeVirtualPath)
at System.ServiceModel.Activation.HostedHttpRequestAsyncResult.HandleRequest()
at System.ServiceModel.Activation.HostedHttpRequestAsyncResult.BeginRequest()
at System.ServiceModel.Activation.HostedHttpRequestAsyncResult.OnBeginRequest(Object state)
at System.ServiceModel.PartialTrustHelpers.PartialTrustInvoke(ContextCallback callback, Object state)
at System.ServiceModel.Activation.HostedHttpRequestAsyncResult.OnBeginRequestWithFlow(Object state)
at System.ServiceModel.Channels.IOThreadScheduler.CriticalHelper.WorkItem.Invoke2()
at System.ServiceModel.Channels.IOThreadScheduler.CriticalHelper.WorkItem.Invoke()
at System.ServiceModel.Channels.IOThreadScheduler.CriticalHelper.ProcessCallbacks()
at System.ServiceModel.Channels.IOThreadScheduler.CriticalHelper.CompletionCallback(Object state)
at System.ServiceModel.Channels.IOThreadScheduler.CriticalHelper.ScheduledOverlapped.IOCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* nativeOverlapped)
at System.ServiceModel.Diagnostics.Utility.IOCompletionThunk.UnhandledExceptionFrame(UInt32 error, UInt32 bytesRead, NativeOverlapped* nativeOverlapped)
at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)
</StackTrace>
конфигурации:
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="wsHttps">
<readerQuotas maxStringContentLength="128000"/>
<security mode="TransportWithMessageCredential">
<transport clientCredentialType="None"/>
<message clientCredentialType="UserName"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" >
<baseAddressPrefixFilters>
<add prefix="https://www.greenjump.nl"/>
</baseAddressPrefixFilters>
</serviceHostingEnvironment>
<behaviors>
<serviceBehaviors>
<behavior name="WsHttpWithAuthBehavior">
<serviceMetadata httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceAuthorization principalPermissionMode="UseAspNetRoles"
roleProviderName="AspNetSqlRoleProvider"/>
<serviceCredentials>
<userNameAuthentication userNamePasswordValidationMode="MembershipProvider"
membershipProviderName="AspNetSqlMembershipProvider" />
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="WsHttpWithAuthBehavior" name="SharpShop.Services.OrderService">
<endpoint address="https://www.greenjump.nl/WebServices/OrderService.svc"
binding="wsHttpBinding"
bindingConfiguration="wsHttps"
contract="SharpShop.Services.IOrderService">
<identity>
<dns value="www.greenjump.nl" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />
</service>
</services>
</system.serviceModel>
Ответы
Ответ 1
Проблема вызвана обработкой IIS нескольких заголовков хостов.
Как сказал ударник.
error: эта коллекция уже содержит адрес со схемой http.
и несколько более подробно здесь
http://forums.silverlight.net/forums/p/12883/274592.aspx
используя первый baseAddresses [0], не является для меня вариантом, потому что мои базовыеAddresses были
http://localhost/WebServices/OrderService.svc
http://www.greenjump.nl/WebServices/OrderService.svc
https://vps2051.xlshosting.net/WebServices/OrderService.svc
в этом порядке, конечно, я мог бы сделать [1], но мне не нравится эта зависимость конфигурации.
Кажется, моя проблема несколько сложнее из-за привязки https, это ServiceHostFactory, с которой я пришел:
public class MyServiceHostFactory : ServiceHostFactory
{
protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
Uri webServiceAddress = baseAddresses[0]; //default to first
if (HttpContext.Current != null) //this only works when aspNetCompatibilityEnabled=true
{
string host = HttpContext.Current.Request.Url.Host;
var goodAddress = baseAddresses.FirstOrDefault(a => a.Host == host);//try to find address with same hostname as request
if(goodAddress!=null)
{
webServiceAddress = goodAddress;
}
Type[] sslServices = { typeof(OrderService) };//add all https services here
if (sslServices.Any(s => s == serviceType))
{
UriBuilder builder = new UriBuilder(webServiceAddress);
builder.Scheme = "https";
builder.Port = 443; //fails if you use another port
webServiceAddress = builder.Uri;
}
}
return new ServiceHost(serviceType, webServiceAddress);
}
}
Тем не менее это кажется взломанным и должно быть разрешено Microsoft.
Ответ 2
Если вы размещаете в IIS, вам не нужна секция базового адреса - как это делает настройка сайта IIS, поэтому удалите этот раздел.
Существует проблема, когда IIS настроен для нескольких заголовков хоста, но в этом случае вам нужно использовать пользовательский factory, который удаляет все адреса, кроме тех, которые вы хотите. Простой пример:
namespace Example
{
public class GenericServiceHostFactory : ServiceHostFactory
{
protected override ServiceHost CreateServiceHost(Type serviceType,
Uri[] baseAddresses)
{
//return the first...
return new ServiceHost(serviceType, baseAddresses[0]);
}
}
}
Тогда вы будете использовать это в своем .svc файле
<%@ ServiceHost
Service="MyImplementationClass"
Factory="Example.GenericServiceHostFactory"
%>
Ответ 3
Два догадки: у вас есть несколько записей с номером endpoint address = "" где-то там.
Они могут не иметь одинаковых значений, но они могут иметь одно и то же имя.
Или, поскольку похоже, что вы используете https://, используете ли вы http на dev-машине и https на живом?
Если да, у вас есть отдельные адреса конечных точек для обоих? Теоретически вы не должны этого делать - вы должны включить безопасность транспорта на http-адрес базы, что предотвратит возможность вызова на что-либо, кроме https.
Технически http и https - это оба http-схемы.
Ответ 4
Попробуйте добавить префикс на ваш производственный сервер в веб-конфигурации:
<serviceHostingEnvironment>
<baseAddressPrefixFilters>
<add prefix="https://www.greenjump.nl:443" />
</baseAddressPrefixFilters>
</serviceHostingEnvironment>
Это будет добавлено к <system.serviceModel>
И ваша конечная точка должна выглядеть так:
<endpoint address="https://www.greenjump.nl:443/WebServices/OrderService.svc"
binding="wsHttpBinding"
bindingConfiguration="wsHttps"
contract="SharpShop.Services.IOrderService">
В противном случае вы всегда можете перегрузить ServiceFactory, как и любой другой комментатор, предлагаемый
Ответ 5
Мне удалось решить проблему, выполнив следующие шаги с помощью Visual Studio 2013:
-
Перейдите в папку проекта, где у вас есть файл *.svc
-
Щелкните правой кнопкой мыши *.svc файл → Просмотреть в браузере
-
Подтвердите, можете ли вы просмотреть службу
-
Перейдите в папку проекта, где у вас есть файл app.config или где вы хотите использовать эту услугу.
-
Проект правой кнопки мыши → Добавить → Сервисная ссылка
-
Нажмите "Обнаружение" → "Сервис служб" → Дайте нужное имя в своей служебной ссылке → Нажмите "ОК"
-
Он создаст "ServiceReference1" в папке "Ссылки на службы" и автоматически создаст/обновит файл app.config
![введите описание изображения здесь]()