ProtocolException Unhandled / (405) Метод не разрешен в WCF; Хотя привязки и конечные точки выглядят правильно
Я только учусь использовать 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 для сайта:
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, который идет с клиентом:
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.
Ошибка происходит в этой строке класса Proxy:
return Channel.GetMessage(name);
Я пытался понять это часами, и я не добился большого прогресса. Если бы кто-то мог хотя бы указать мне правильное направление, я был бы очень признателен.
И последнее: я хочу написать клиент и прокси с нуля, без использования svcutil.exe.