iis ProtocolException未处理/(405)WCF不允许使用此方法;绑定和端点看起来是正确的

khbbv19g  于 2023-01-17  发布在  其他
关注(0)|答案(5)|浏览(143)

我刚开始学习如何使用WCF,我正在尝试从头开始编写一个小HelloWorld程序(包括主机和客户端)。每当我的客户端尝试使用该服务时,我都会收到一个ProtocolException Unhandled,我不知道为什么。我使用IIS托管该服务。
关于我做事的方式:我正在尽我最大的努力将客户端、代理、主机、服务和契约分开,正如video中详细描述的和article中概述的那样,基本上我在解决方案中为每一个项目都有不同的项目。
下面是一些不同的文件,显示我所说的:

服务

namespace HelloWorld
{
  public class HelloWorldService : IHelloWorldService
  {
    public String GetMessage(String name)
    {
        return "Hello World from " + name + "!";
    }
  }
}

合同

namespace HelloWorld
{
  [ServiceContract]
  public interface IHelloWorldService
  {
      [OperationContract]
      String GetMessage(String name);
  }
}

代理

namespace HelloWorld
{
  public class Proxy : ClientBase<IHelloWorldService>, IHelloWorldService
  {
    #region IHelloWorldService Members

    public String GetMessage(String name)
    {
        return Channel.GetMessage(name);
    }

    #endregion

  }

}

客户

namespace Client
{
  public partial class Form1 : Form
  {
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click_1(object sender, EventArgs e)
    {
        Proxy proxy = new Proxy();
        MessageBox.Show(proxy.GetMessage(textBox1.Text));
    }
  }

}
客户端只是一个带有文本框和按钮的表单,它试图使用文本框中的内容作为参数来执行GetMessage(),还有另一个类实际上创建了表单的示例。
下面是我的网站的web.config:

Web配置

<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MyServiceTypeBehaviors">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior> 
      </serviceBehaviors>
    </behaviors>
    <services>
      <service name="HelloWorld.HelloWorldService" behaviorConfiguration="MyServiceTypeBehaviors">
        <endpoint address="http://localhost:8002/" binding="basicHttpBinding" contract="HelloWorld.IHelloWorldService"/>
        <endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex"/>
      </service>
    </services>
  </system.serviceModel>
</configuration>

下面是我的app.config,它与客户端一起使用:

应用程序配置

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <client>
      <endpoint address="http://localhost:8002/" binding="basicHttpBinding" contract="HelloWorld.IHelloWorldService" />
    </client>
  </system.serviceModel>

</configuration>

我的svc文件很短,只是:

您好,世界服务. svc

<%@ServiceHost Service="HelloWorld.HelloWorldService"%>

我知道该服务正在运行,因为当我在浏览器中导航到http://localhost:8002/HelloWorldService.svc时,屏幕上显示
您已经创建了一个服务。
要测试此服务,您需要创建一个客户端并使用它来调用服务。
这里就是障碍所在:服务使用IIS运行,我启动了客户端的一个示例,带有文本框和按钮的窗口出现,我键入一些字母,点击按钮,然后程序崩溃,我得到了ProtocolException Unhandled, (405) Method not allowed.错误发生在Proxy类的这一行:

return Channel.GetMessage(name);

我已经花了好几个小时想弄明白这个问题,但我没有取得多大进展。如果有人能至少给我指出正确的方向,我将非常感激。
最后一件事:我想从头开始编写客户端和代理,而不使用svcutil.exe。

z0qdvdin

z0qdvdin1#

当你转到基址(.svc)时,它工作的原因是这是一个HTTP GET操作,以获取服务的元数据。当你调用服务合同上的方法时,你正在执行POST操作,很可能你只是没有启用这个功能。根据你的目标.NET版本,它将是红色突出显示的其中一个。

0ve6wy6x

0ve6wy6x2#

您必须在客户端配置的端点标记中指定服务的完整地址,如下所示:

<endpoint address="http://localhost:8002/HelloWorldService.svc" binding="basicHttpBinding" contract="HelloWorld.IHelloWorldService" />

别忘了在端点标记的地址属性中的服务名称后面添加**'. svc'**扩展名。这对我很有效。希望你现在就能得到解决方案。
客户端配置如下所示:

<system.serviceModel>
<bindings>
  <wsHttpBinding>
    <binding name="WSHttpBinding_IService"/>
  </wsHttpBinding>
</bindings>
<client>
  <endpoint address="http://localhost:61569/Service1.svc" binding="wsHttpBinding" 
            bindingConfiguration="WSHttpBinding_IService" contract="WcfServiceApp.IService1" name="WSHttpBinding_IService"/>
</client>
pjngdqdw

pjngdqdw3#

好的,找到了一个解决方案,虽然我不完全确定它为什么有效。我猜当你使用Cassini或IIS或任何托管网站时,你不应该在web.config文件的端点中指定一个地址,我所要做的就是把它改为address="",然后它就开始正常工作了。请确保服务器承载服务的端口与app.config文件中的代码匹配。

44u64gxh

44u64gxh4#

必须在客户端配置的端点标记中指定服务的完整地址
地址=“http://localhost:8002/HelloWorldService.svc”,您可以在其中放置相同的端点配置。
当我被困在地狱里的时候它确实对我起作用了...

nwwlzxa7

nwwlzxa75#

启用以下两个组件对我很有效。

相关问题