wcf REST Services и JQuery Ajax Post: метод не разрешен - PullRequest
4 голосов
/ 09 июля 2011

Кто-нибудь знает, что с этим не так? Я не могу получить ответ json от моей службы отдыха wcf.

Jquery



$.ajax({
  type: 'POST',
  url: "http://localhost:8090/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');
  }

});


Услуги



  [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
    public class UserService: IUserService
    {
        private readonly IUserRepository _repository;

        public UserService()
        {
            _repository = new UserRepository();
        }

        public ServiceObject ValidateUser(string username, string password)
        {
           //implementation
        }
    }

    [ServiceContract]
    public interface IUserService
    {
        [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)]
        [OperationContract]
        ServiceObject ValidateUser(string username, string password);
    }


веб-конфигурация



 <system.serviceModel>

    <!--Behaviors here.-->
    <behaviors>
      <endpointBehaviors>
        <behavior name="defaultEndpointBehavior">
          <webHttp/>
        </behavior>
      </endpointBehaviors>

      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <!--End of Behaviors-->

    <!--Services here-->   
   <services>
      <service name="MyWcf.Services.UserService">
        <endpoint address="UserService" behaviorConfiguration="defaultEndpointBehavior"
          binding="webHttpBinding" contract="MyWcf.Services.IUserService" />
      </service>
    </services>

    <!--End of Services-->

    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
    <standardEndpoints>
      <webHttpEndpoint>
        <standardEndpoint name=""
                          helpEnabled="true"
                          automaticFormatSelectionEnabled="true"
                          defaultOutgoingResponseFormat ="Json"
                          crossDomainScriptAccessEnabled="true"/>
      </webHttpEndpoint>
    </standardEndpoints>
  </system.serviceModel>


Ответы [ 3 ]

9 голосов
/ 09 июля 2011

Я вижу несколько проблем в вашем коде:

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 в определении конечной точки, и вы не 'Необходимо указать поведение (это часть стандартной конечной точки).Также вы не используете междоменные вызовы, поэтому вам не нужно их включать, и вам не нужен формат по умолчанию, потому что он разрешается автоматически.

2 голосов
/ 09 февраля 2012

Я считаю, что Иван находится на правильном пути!

Вы вызываете свой сервис из javascript в браузере, верно?

Расположена ли html-страница с этим javascript в том же доменекак служба wcf?

Если они не находятся в одном домене , то я бы сказал, что это проблема межсайтовый скриптинг .Я считаю, что GET разрешен кросс-сайтов, но POST нет.http://en.wikipedia.org/wiki/JSONP будет решением, если он поддерживается на стороне сервера (WCF)

1 голос
/ 25 июля 2011

Вы тестировали на одном домене. Полагаю, автор пытается позвонить с другого домена. Это может быть невозможно из-за междоменных вызовов.

...