WCF和JSON绑定

seb*_*ibu 4 wcf json wcf-binding wcf-rest

我正在尝试创建一个返回json的wcf服务.我的配置文件有一些问题,我也不知道如何测试它.

<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="false" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <services>
      <service name="ContactLibraryJSON.ContactLibrary">
        <endpoint address="" binding="webHttpBinding" bindingConfiguration="JSONEndpointBehavior"
          contract="ContactLibraryJSON.IContactServiceJSON" />
        <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration=""
          contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://192.168.1.31/ContactLibraryJSON" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="JSONEndpointBehavior">
          <webHttp/>
        </behavior>
        <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="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>
</configuration>
Run Code Online (Sandbox Code Playgroud)

我还是得到的

"无法将行为扩展webhttp添加到服务行为名称,JSONEndpointBehavior因为基础行为类型未实现IServiceBehaviorInterface"

联系人的定义如下:

[DataContract(Name="Contact")]
public class Contact
{        
    [DataMember(Name="FirstName")]
    public string firstName=null;
    [DataMember(Name="LastName")]
    public string lastName=null;
    [DataMember(Name="Email")]
    public string email=null;
    [DataMember(Name = "Age")]
    public int age = 0;
    [DataMember(Name = "Street")]
    public string street=null;
    [DataMember(Name = "City")]
    public string city=null;
    [DataMember(Name = "Country")]
    public string country=null;
}
Run Code Online (Sandbox Code Playgroud)

IContactService定义如下:

[ServiceContract]
public interface IContactServiceJSON
{
    [OperationContract]
    [WebGet(BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json, UriTemplate = "")]
    Contact GetContact();        
}
Run Code Online (Sandbox Code Playgroud)

执行GetContact:

public Contact GetContact()
{
    return new Contact()
    {
        firstName = "primulNume",
        lastName = "alDoileaNume",
        age = 33,
        city = "Cluj",
        country = "Romania",
        email = "ceva@mail.com",
        street = "Bizusa 8"
    };
}
Run Code Online (Sandbox Code Playgroud)

我的服务在我的局域网中另一台计算机上运行 基地址如下:http://192.168.1.xxx/ContactLibraryService.ContactLibraryService由IIS托管并转换为应用程序.

car*_*ira 5

您需要添加<webHttp/>端点行为列表.此外,端点需要使用webHttpBinding.最后,要响应GETHTTP请求,您需要使用该WebGet属性(而不是WebInvoke(Method="GET").

  <system.serviceModel> 
    <services> 
      <service name="ContactLibrary.ContactLibrary"> 
        <endpoint address=""
                  binding="webHttpBinding"
                  behaviorConfiguration="JSONEndpointBehavior" 
                  contract="ContactLibrary.IContact"/>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
        <endpoint address="ws"
                  binding="wsHttpBinding"
                  bindingConfiguration="" 
                  contract="ContactLibrary.IContact" /> 
        <host> 
          <baseAddresses> 
            <add baseAddress="http://localhost/ContactLibrary" /> 
          </baseAddresses> 
        </host> 
      </service> 
    </services> 
    <behaviors> 
      <endpointBehaviors> 
        <behavior name="JSONEndpointBehavior"> 
          <webHttp/> 
        </behavior> 
      </endpointBehaviors> 
      <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="true"/> 
        </behavior> 
      </serviceBehaviors> 
    </behaviors> 
  </system.serviceModel> 
Run Code Online (Sandbox Code Playgroud)

和服务合同:

[ServiceContract]  
public interface IContact  
{  
    [OperationContract]  
    [WebGet(BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json, UriTemplate = "contact")]  
    Contact GetContact(int idContact);        
}  
Run Code Online (Sandbox Code Playgroud)