Служба WCF с общим хостером вызывает 404 (помещено в приложение IIS)
Если я пытаюсь выполнить метод, используя jQuery или через браузер, я получаю 404. Моя конфигурация выглядит следующим образом:
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="RegistrationBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="RegistrationEndpointBehavior">
<enableWebScript/>
</behavior>
</endpointBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
<services>
<service name="Corp.EmployeeService" behaviorConfiguration="RegistrationBehavior">
<endpoint address="" binding="webHttpBinding" contract="Corp.IEmployeeService" behaviorConfiguration="RegistrationEndpointBehavior" />
</service>
</services>
</system.serviceModel>
Я полагаю, что это как-то связано с конфигурацией, так как мой метод украшен OperationContract и атрибутом WebInvoke.
Мой интерфейс (упрощенный для публикации) выглядит примерно так:
namespace Corp
{
[ServiceContract]
public interface IEmployeeService
{
[OperationContract]
[WebInvoke(ResponseFormat = WebMessageFormat.Json, Method = "POST")]
int Register(string username);
}
}
На самом классе обслуживания я украсил его следующим атрибутом:
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class EmployeeService : IEmployeeService
Как я уже говорил, я пытался запустить службу, используя http://localhost/EmployeeService.svc/Register или используя jQuery, например так:
$.ajax({
cache: false,
async: true,
type: "POST",
dataType: "json",
url: "http://localhost/EmployeeService.svc/Register",
data: '{"username":"test"}',
contentType: "application/json;charset=utf-8",
success: function (msg) {
var status = msg.RegisterResult;
if (status == 1) {
alert('Success');
} else {
alert('Failure');
}
},
error: function (msg) {
alert('Exception - ' + msg);
}
});
Оба возвращают 404.
Поскольку я предоставляю этот сервис совместно с компанией, предоставляющей общий хостинг, я создал свой сервис на ServiceFactory, как показано ниже:
public class IisServiceHostFactory : ServiceHostFactory
{
protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
var newAddress = baseAddresses[0];
if (!newAddress.AbsoluteUri.Contains("http://www."))
newAddress = new Uri(newAddress.AbsoluteUri.Replace("http://", "http://www."));
var webServiceHost = new IisServiceHost(serviceType, newAddress);
return webServiceHost;
}
}
public class IisServiceHost : ServiceHost
{
public IisServiceHost(Type serviceType, params Uri[] baseAddresses): base(serviceType, baseAddresses) { }
}
POST происходит при попытке ударить его из jQuery. Ответ 404 (из другого примера сервиса, который был упрощен для тестирования) показан ниже:
Текст этого исключения: HTTP 404. Требуемый ресурс (или одна из его зависимостей) мог быть удален, изменилось его имя или временно недоступен. Пожалуйста, просмотрите следующий URL и убедитесь, что он написан правильно.