метод 405 не разрешен с использованием [webHttpBinding]

#wcf #iis-7.5 #wcf-binding #wcf-ria-services #wcf-client

#wcf #iis-7.5 #wcf-привязка #wcf-ria-services #wcf-клиент

Вопрос:

У меня возникают проблемы с вызовом jquery wcf. Я уже провел поиск и нашел некоторые решения, но он по-прежнему выдает мне ошибку «метод 405 не разрешен». Ниже приведен код may

-Интерфейс

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.ServiceModel.Activation;
using System.ServiceModel.Web;
using System.ServiceModel;

namespace WcfServiceLibrary
{
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IContactService" in both code and config file together.
    [ServiceContract]
    public interface IContactService
    {
        [WebInvoke(Method = "GET",
         ResponseFormat = WebMessageFormat.Json)]
        [OperationContract]
        Contact GetContactInfo();
    }
}
  
  • Мой сервис

    использование системы; использование System.Коллекции.Общий; с использованием System.Linq; с использованием System.Runtime.Сериализация; с использованием System.ServiceModel; с использованием System.Text; с использованием System.ServiceModel.Активация; с использованием System.ServiceModel.Веб; использование системы.ServiceModel;

    пространство имен WcfServiceLibrary { // ПРИМЕЧАНИЕ: Вы можете использовать команду «Переименовать» в меню «Рефакторинг», чтобы изменить имя класса «ContactService» как в коде, так и в файле конфигурации одновременно.

     [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class ContactService : IContactService
    {
    
        public Contact GetContactInfo()
        {
            ContactBL contactBL = new ContactBL();
    
            return contactBL.GetContact();
        }
    
    }
      

    }

  • Мой объект

использование системы; использование System.Коллекции.Общий; с использованием System.Linq; с использованием System.Text; с использованием System.Runtime; с использованием System.Runtime.Сериализация;

 namespace WcfServiceLibrary
{
    [DataContract]
    public class Contact
    {
        [DataMember]
        public int Id {get;set;}
        [DataMember]
        public string Fullname {get; set;}
        [DataMember]
        public string email { get; set; }
    }
}
  
  • BL

использование системы; использование System.Коллекции.Общий; с использованием System.Linq; с использованием System.Text;

 namespace WcfServiceLibrary
{
    class ContactBL
    {
        public ContactBL() { }
        public Contact GetContact()
        {
            return new Contact {email="thang.nguyen@saas.com.vn", Fullname="NVTThang",Id=2 };
        }
    }
}
  

А также моя конфигурация WCF:

 <?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0"/>
  </system.web>
  <system.serviceModel>
    <bindings>
      <webHttpBinding>
        <binding name="webBinding">
          <security mode="None" />
        </binding>
      </webHttpBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="myBehavior" name="WcfServiceLibrary.ContactService">
        <endpoint address="ajaxEp" behaviorConfiguration="epAjaxBehavior"
          binding="webHttpBinding" bindingConfiguration="webBinding" name="epWebHttp"
          contract="WcfServiceLibrary.IContactService" />
        <endpoint address="mex" binding="mexHttpBinding" name="epMex"
          contract="IMetadataExchange" />
      </service>
    </services>
    <behaviors>
      <endpointBehaviors>
        <behavior name="epAjaxBehavior">
          <webHttp />
          <enableWebScript/>
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="myBehavior">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true">
      <baseAddressPrefixFilters>
        <add prefix="http://localhost"/>
      </baseAddressPrefixFilters>
    </serviceHostingEnvironment>
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>
</configuration>
  

Я развертываю свой wcf на IIS 7.5, затем я создал веб-клиент, используя вызов jquery ajax для моей службы.

 $.ajax({
                type: "GET", 
                url: "http://localhost/WcfTestService/Service.svc/ajaxEp/GetContactInfo", 
                data: '',
                contentType: "application/json;charset=utf-8", 
                dataType: "json", 
                processdata: true,
                success: function (msg) {
                    alert(msg);
                    //ServiceSucceeded(msg);
                },
                error: ServiceFailed
            });

 function ServiceFailed(err){
            alert(err.responseText);

            return;
        }
  

когда я вызываю свой сервис, он всегда выдает мне сообщение «Метод 405 не разрешен», и я пробовал aspnet_regiis -i и ServiceModelReg -i, но это не сработало. Пожалуйста, предложите мне какие-либо решения.

Заранее спасибо!

Ответ №1:

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

Для запросов «GET» вам следует использовать WebGet вместо WebInvoke в вашем контракте:

 [ServiceContract]
public interface IContactService
{
    [WebGet(ResponseFormat = WebMessageFormat.Json)]
    [OperationContract]
    Contact GetContactInfo();
}
  

В поведении вашей конечной точки у вас есть 2 варианта поведения для написания сценариев: webHttp и enableWebScript. Вам нужен только первый. Последний предназначен для интеграции с ASP.NET В частности, AJAX.

 <endpointBehaviors>
  <behavior name="epAjaxBehavior">
    <webHttp />
  </behavior>
</endpointBehaviors>
  

Вероятно, это не вызывает никаких проблем, но в вызове $.ajax вам не нужно указывать тип содержимого, поскольку это запрос GET (поэтому содержимого нет). Кроме того, поскольку вы не передаете никаких параметров, вам также не нужен параметр data.

 $.ajax({
    type: "GET", 
    url: "http://localhost/WcfTestService/Service.svc/ajaxEp/GetContactInfo", 
    dataType: "json", 
    success: function (msg) {
        alert(msg);
        //ServiceSucceeded(msg);
    },
    error: ServiceFailed
});
  

Комментарии:

1. Я изменил свою конфигурацию, а также мой скрипт jquery для вызова wcf. Но он отображает мне нулевые данные. Вот мой скрипт $.get(‘ localhost/WcfTestService/Service.svc/ajaxEp/GetContactInfo ‘, функция (данные) { оповещение (данные); });

2. Можете ли вы запустить его через Fiddler (www.fiddlertool.com ) чтобы увидеть, что клиент отправляет на сервер, и что сервер возвращает?

Ответ №2:

Попробуйте это в своем сервисе:

 [ScriptMethod]
public Contact GetContact(...)
  

Комментарии:

1. [ScriptMethod] не является необходимым для служб WCF; метод вызывается скриптами с использованием соответствующей привязки (webHttpBinding) и поведения (webHttp)

2. В его коде было несколько проблем, на которые я указал в ответе. [ScriptMethod] не решит проблему, поскольку он выполняется только в классах, производных от System.Web.Services. Веб-сервис