C # 4.0 WCF REST JSON - HTTP GET COET 400 Неверный запрос - PullRequest
10 голосов
/ 08 декабря 2011

При попытке создать простой сервис для возврата простой строки JSON, следуя нескольким учебникам. Я застрял на двух разных машинах с неправильным запросом HTTP Statuscode 400. Пример учебников Служба RESTful WCF с JSON pt.1 & pt.2 - http://www.youtube.com/watch?v=5BbDxB_5CZ8

Я также Google и искал здесь (StackOverflow) для аналогичной проблемы без успеха.

Проблема в том, что я получаю неверный запрос 400 при попытке выполнить проверку работоспособности, чтобы перейти к службе WCF и выполнить метод. Составив сервис и просмотрите этот адрес: http://localhost:49510/Service1.svc/GetPerson Так же, как учебник. Я пытался найти решение в течение 3 дней. Любая помощь приветствуется.

Это то, что я делаю.

Сначала я создаю новый проект - простое приложение службы WCF. Я удаляю Service1.svc по умолчанию и добавляю новую службу WCF, которая генерирует новый Service1.svc и IService1.cs

Вот код для интерфейса ( IService1.cs )

namespace WcfService1
{
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IService1" in both code and config file together.
    [ServiceContract]
    public interface IService1
    {
        [OperationContract]
        [WebInvoke(Method="GET", BodyStyle=WebMessageBodyStyle.Bare, ResponseFormat=WebMessageFormat.Json, RequestFormat=WebMessageFormat.Json, UriTemplate="GetPerson")]
        Person GetPerson();
    }

    [DataContract(Name="Person")]
    public class Person
    {
        [DataMember(Name="name")]
        public string Name { get; set; }
    }
}

Вот код для Service1.svc

namespace WcfService1
{
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Service1" in code, svc and config file together.
    public class Service1 : IService1
    {
        public Person GetPerson()
        {
            return new Person() { Name = "Tobbe" };
        }
    }
}

И Web.config не тронут и выглядит вот так web.config

<?xml version="1.0"?>
<configuration>

  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="true"/>
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
 <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>

</configuration>

Ответы [ 3 ]

14 голосов
/ 08 декабря 2011

Для REST WCF Необходимо выполнить привязку и настройку конечной точки в web.config

Замените весь ваш web.config следующим, и он будет работать

<?xml version="1.0"?>
<configuration>

  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <protocolMapping>
      <add scheme="http" binding="webHttpBinding"/>
    </protocolMapping>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="true"/>
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="false"/>

        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior>
          <webHttp/>
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
 <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>  
 </configuration>

Вы остались со следующими 2 вещами

Использовать webHttpBinding (изменить сопоставление порта http по умолчанию на webHttpBinding)

<system.serviceModel>
    <protocolMapping>
        <add scheme="http" binding="webHttpBinding"/>
    </protocolMapping>
    <behaviors>

<system.serviceModel>

Укажите поведение конечной точки webHttp

<system.serviceModel>
    -----
    </protocolMapping>
    <behaviors>
        <endpointBehaviors>
            <behavior>
                <webHttp />
            </behavior >
        </endpointBehaviors>
    <behaviors>
    ------
<system.serviceModel> 
5 голосов
/ 08 декабря 2011

Вы не указали конечную точку ... По умолчанию в WCF 4 будет использоваться конечная точка, использующая basicHttpBinding.Это не будет работать здесь, потому что это привязка на основе SOAP.То, что вы хотите использовать, это webHttpBinding, основанный на REST ...

Вот как переопределить связывание по умолчанию с WCF 4:

<system.serviceModel>
  <protocolMapping>
    <add scheme="http" binding="webHttpBinding"/>
  </protocolMapping>
</system.serviceModel>

Вы также должны включить webHttp, добавив этоповедение конечной точки в вашей конфигурации:

<behaviors>
    <endpointBehaviors>
        <behavior>
            <webHttp />
        </behavior >
    </endpointBehaviors>
<behaviors>

http://msdn.microsoft.com/en-us/library/bb924425.aspx

2 голосов
/ 30 января 2018

Я не совсем уверен, почему, но когда я добавил атрибут 'Factory' в мой файл .SVC (вам нужно явно перетащить его в Visual Studio), все просто работает - без изменений настроек по умолчанию в Web.config!

Я добавил Factory = "System.ServiceModel.Activation.WebServiceHostFactory" , поэтому мой файл .SVC ушел из этого:

<%@ ServiceHost Language="C#" Debug="true" Service="ServiceNameSpace.ServiceName" CodeBehind="ServiceName.svc.cs" %>

к этому:

<%@ ServiceHost Language="C#" Debug="true" Service="ServiceNameSpace.ServiceName" CodeBehind="ServiceName.svc.cs" Factory="System.ServiceModel.Activation.WebServiceHostFactory" %>

Единственным побочным эффектом, по-видимому, является то, что при нажатии на файл .SVC в браузере появляется ошибка «Конечная точка не найдена», но служба все равно работает нормально, если вы все равно правильно ее вызываете. Как упоминалось ранее, я использую Web.config по умолчанию с .NET 4.6 ( Упрощенная конфигурация WCF ), поэтому мне, возможно, все же потребуется добавить сведения о конечной точке, чтобы это снова работало.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...