405 方法不允许使用 [webHttpBinding]

发布于 2024-11-09 10:47:10 字数 4991 浏览 0 评论 0原文

我在 jquery 调用 wcf 时遇到问题。我已经搜索并找到了一些解决方案,但它仍然引发错误“405 method not allowed”。下面是可能的代码

-接口

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.Collections.Generic; 使用 System.Linq; 使用 System.Runtime.Serialization; 使用 System.ServiceModel; 使用系统文本; 使用 System.ServiceModel.Activation; 使用 System.ServiceModel.Web; 使用 System.ServiceModel;

    命名空间 WcfServiceLibrary { // 注意:您可以使用“重构”菜单上的“重命名”命令来同时更改代码和配置文件中的类名“ContactService”。

    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    公共类 ContactService : IContactService
    {
    
        公共联系人 GetContactInfo()
        {
            ContactBL contactBL = new ContactBL();
    
            返回 contactBL.GetContact();
        }
    
    }
    

    }

  • 我的对象

; 使用 System.Collections.Generic; 使用 System.Linq; 使用系统文本; 使用系统运行时; 使用 System.Runtime.Serialization;

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.Collections.Generic; 使用 System.Linq; 使用系统文本;

namespace WcfServiceLibrary
{
    class ContactBL
    {
        public ContactBL() { }
        public Contact GetContact()
        {
            return new Contact {email="[email protected]", 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>

我在 IIS 7.5 上部署 WCF,然后使用 jquery ajax 调用我的服务创建了一个 Web 客户端。

$.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 Method Not allowed”,我尝试过 aspnet_regiis -i 和 ServiceModelReg -i 但没有效果。请向我建议任何解决方案。

提前致谢!

I'm getting problems with jquery call wcf. I've already search and found some solutions but it still raise me an error "405 method not allowed". Below is may code

-Interface

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();
    }
}
  • My service

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.Serialization;
    using System.ServiceModel;
    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 class name "ContactService" in both code and config file together.

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

    }

  • My object

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime;
using System.Runtime.Serialization;

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace WcfServiceLibrary
{
    class ContactBL
    {
        public ContactBL() { }
        public Contact GetContact()
        {
            return new Contact {email="[email protected]", Fullname="NVTThang",Id=2 };
        }
    }
}

And also my WCF configuration:

<?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>

The I deploy my wcf on IIS 7.5 then I created a web client using jquery ajax call to my service.

$.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;
        }

when I call my service it always raises me "405 Method Not Allowed" and I've tried aspnet_regiis -i and ServiceModelReg -i but it didn't effect. Please suggest me any solutions.

Thanks in advance!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

玩物 2024-11-16 10:47:10

我可以看到您的服务中存在一些问题:

对于“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 请求(因此没有内容)。此外,由于您没有传递任何参数,因此也不需要数据参数。

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

I can see a few problems in your service:

For "GET" requests, you should use WebGet, instead of WebInvoke, on your contract:

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

In your endpoint behavior you have 2 behaviors for scripting: webHttp and enableWebScript. You only need the former. The latter is for integration with ASP.NET AJAX specifically.

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

This probably isn't causing any issues, but in the $.ajax call, you don't need to specify a content-type, since it's a GET request (so there's no content). Also, since you aren't passing any parameter, you also don't need the data parameter.

$.ajax({
    type: "GET", 
    url: "http://localhost/WcfTestService/Service.svc/ajaxEp/GetContactInfo", 
    dataType: "json", 
    success: function (msg) {
        alert(msg);
        //ServiceSucceeded(msg);
    },
    error: ServiceFailed
});
野の 2024-11-16 10:47:10

在您的服务中尝试一下:

[ScriptMethod]
public Contact GetContact(...)

Try this in your service:

[ScriptMethod]
public Contact GetContact(...)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文