Я вижу несколько проблем в вашем коде:
405 означает, что метод запрещен - это может означать, что вы публикуете данные на неправильном ресурсе.Вы уверены, что ваш адрес правильный?Как вы выставляете сервис?Это .svc
файл или ServiceRoute
?Если это файл .svc
, адрес будет UserService.svc/UserService/ValidateUser
- UserService.svc, потому что это точка входа для вашего сервиса (если вы используете
ServiceRoute
, вы можете переопределить этот - UserService, потому что вы определяете этот относительный адрес в конфигурации конечной точки
- ValidateUser, потому что это точка входа по умолчанию для вашей операции
Теперь ваш запрос JSON совершенно неверен, а подпись вашего метода какХорошо. Подпись метода в вашем сервисном контракте должна ожидать один объект JSON = это должен быть один контракт данных, например:
[DataContract]
public class UserData
{
[DataMember]
public string UserName { get; set; }
[DataMember]
public string Password { get; set; }
}
, а сигнатура операции будет:
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Bare)]
[OperationContract]
ServiceObject ValidateUser(UserData userData);
Оболочки нетэлемент в запросе JSON, и поэтому вы должны использовать Bare
. Также нет необходимости устанавливать формат ответа, потому что вы установите его на уровне конечной точки (кстати, вы также должны установить формат запроса, если вы этого не сделаете).
Как только вы определили контракт данных для своего запроса, вы должны правильно определить сам запрос ajax:
$.ajax({
type: 'POST',
url: "UserService.svc/UserService/ValidateUser",
data: '{"UserName":"newuser","Password":"pwd"}',
contentType: "application/json; charset=utf-8",
success: function (msg) {
alert(msg);
},
error: function (xhr, ajaxOptions, thrownError) {
alert('error');
}
});
Объект JSON имеет видстрока!и всех его участников!
Для последнего измените свою конфигурацию на:
<system.serviceModel>
<services>
<service name="UserService.UserService">
<endpoint address="UserService" kind="webHttpEndpoint" contract="UserService.IUserService" />
</service>
</services>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
<standardEndpoints>
<webHttpEndpoint>
<standardEndpoint helpEnabled="true" automaticFormatSelectionEnabled="true" />
</webHttpEndpoint>
</standardEndpoints>
</system.serviceModel>
Если вы хотите использовать standardEndpoint
, вы должны использовать kind
в определении конечной точки, и вы не 'Необходимо указать поведение (это часть стандартной конечной точки).Также вы не используете междоменные вызовы, поэтому вам не нужно их включать, и вам не нужен формат по умолчанию, потому что он разрешается автоматически.