Подтвердить что ты не робот

ProtocolException Необработанный /(405) Метод не разрешен с WCF; Привязки и конечные точки выглядят правильно, хотя

Я просто изучаю, как использовать WCF, и я пытаюсь написать небольшую программу HelloWorld с нуля (как на стороне хоста, так и на стороне клиента). Я получаю ProtocolException Unhandled, когда мой клиент пытается использовать эту услугу, и я не могу понять, почему. Я использую службу с помощью IIS.

Относительно того, как у меня создаются вещи: я делаю все возможное, чтобы разделить клиент, прокси, хост, службу и контракт, как описано в этом видео и, как описано в article. В основном у меня есть разные проекты в рамках решения для каждого из них.

Вот несколько разных файлов, показывающих, о чем я говорю:

Сервис

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

Contract

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

Proxy

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

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

    #endregion

  }

}

Client

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.

4b9b3361

Ответ 1

Хорошо, нашел решение, хотя я не совсем уверен, почему он работает. Я думаю, что когда вы используете Cassini или IIS или что-то еще, чтобы размещать веб-сайт, вы не должны указывать адрес в конечной точке файла web.config. Все, что мне нужно было сделать, это изменить его на address="", и он начал работать правильно. Обязательно убедитесь, что порт, на котором размещен ваш сервер, соответствует коду в файле app.config.

Ответ 2

Причина, по которой он работает при переходе на базовый адрес (.svc), заключается в том, что это операция HTTP GET для получения метаданных для службы. Когда вы вызываете метод по вашему контракту на обслуживание, вы выполняете операцию POST и, скорее всего, у вас просто нет этой функции. В зависимости от выбранной вами версии .NET она будет выделена красным цветом.

enter image description here

Ответ 3

Вы должны указать полный адрес для своей службы в теге конечной точки конфигурации клиента. Вот так:

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

Ответ 4

Вы должны указать полный адрес для своей службы в теге конечной точки конфигурации клиента

address = "http://localhost: 8002/HelloWorldService.svc", где вы устанавливаете одинаковые конфигурации конечных точек.

Это работало для меня, когда я оказался в аду...