我只是在学习如何使用 WCF,我正在尝试从头开始编写一个小 HelloWorld 程序(主机和客户端)。ProtocolException Unhandled
每当我的客户尝试使用该服务时,我都会得到一个,但我不知道为什么。我正在使用 IIS 托管服务。
关于我的设置方式:我正在尽我最大的努力将客户端、代理、主机、服务和合同分开,如本视频中所述和本文中所述。基本上,我在每个解决方案中都有不同的项目。
以下是一些不同的文件,显示了我在说什么:
服务
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:
网页配置
<?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 文件很短,只是:
HelloWorldService.svc
<%@ServiceHost Service="HelloWorld.HelloWorldService"%>
我知道该服务正在运行,因为当我http://localhost:8002/HelloWorldService.svc
在浏览器中导航到时,我看到的屏幕显示
您已经创建了一个服务。
要测试此服务,您需要创建一个客户端并使用它来调用该服务。
所以这就是问题发生的地方:服务正在使用 IIS 运行,我启动了一个客户端实例,带有文本框和按钮的窗口出现,我输入一些字母,点击按钮,然后程序崩溃,我得到ProtocolException Unhandled, (405) Method not allowed.
错误发生在代理类的这一行:
return Channel.GetMessage(name);
我一直试图解决这个问题好几个小时,但我没有取得太大进展。如果有人至少能指出我正确的方向,我将不胜感激。
最后一件事:我想从头开始编写客户端和代理,而不使用 svcutil.exe。