C# 4.0 WCF REST JSON-HTTP получить код 400 плохой запрос
при попытке создать простой сервис для возврата простой строки JSON, следуя нескольким учебникам. Я застрял на двух разных машинах с HTTP 400 ошибочный запрос состояния. Пример учебники RESTful служба WCF с JSON pt.1 & pt.2 -http://www.youtube.com/watch?v=5BbDxB_5CZ8
Я также Google и искал здесь (StackOverflow) для подобной проблемы без успеха.
проблема в том, что я получаю плохой запрос 400 при попытке сделать проверка здравомыслия, чтобы перейти к службе WCF и выполнить метод. Путем компиляции сервиса и просмотра этого адреса:http://localhost:49510/Service1.ВПВ/транзакции getperson Как и в учебнике. Я попытался найти решение, как 3 дней. Любая помощь приветствуется.
Это то, что я делаю.
сначала я создаю новый проект простого приложения-Службы WCF. Я удаляю службу по умолчанию Service1.svc и добавьте новую службу WCF, которая генерирует новую Service1.ВПВ и Файл 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; }
}
}
здесь код Службу1.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
<?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 ответов
для REST WCF вам нужно выполнить привязку и настройку конечной точки в интернете.config
замените всю свою сеть.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>
вы не указали конечную точку... По умолчанию в WCF 4 будет использоваться конечная точка, использующая basicHttpBinding. Это не будет работать здесь, потому что это привязка на основе мыла. Вы хотите использовать webHttpBinding, который основан на REST...
вот как переопределить привязку по умолчанию с помощью WCF 4:
<system.serviceModel>
<protocolMapping>
<add scheme="http" binding="webHttpBinding"/>
</protocolMapping>
</system.serviceModel>
вы также должны включить webHttp, добавив это поведение конечной точки в свою конфигурацию :
<behaviors>
<endpointBehaviors>
<behavior>
<webHttp />
</behavior >
</endpointBehaviors>
<behaviors>
Я не совсем уверен, почему, но когда я добавил атрибут "Фабрика" к моему .SVC-файл (вам нужно явно перетащить его в Visual Studio), все просто работает - без каких-либо изменений настроек по умолчанию в Интернете.конфиг!
добавил Фабрика="Системы.Средство servicemodel.Активация.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-файл в браузере, вы получаете "конечная точка не найдена" ошибка, но служба работает нормально, когда вы вызываете его правильно в любом случае. Как упоминалось ранее, я использую веб-сайт по умолчанию.config с .Чистая 4.6 (упрощенная конфигурация WCF), поэтому мне, возможно, еще нужно добавить детали конечной точки, чтобы это снова сработало.
Примечание для модератора: мои извинения за размещение этого ответить на пару вопросов. Не буду снова. Однако я не думаю, что удаление его из обоих вопросов было очень сбалансированным. Вот почему я опубликовал этот ответ только здесь.