明天的明天 永远的永远 未知的一切 我与你一起承担 ??

是非成败转头空 青山依旧在 几度夕阳红 。。。
  博客园  :: 首页  :: 管理

WCF: 以Json格式返回对象

Posted on 2012-06-04 11:57  且行且思  阅读(9221)  评论(2编辑  收藏  举报

1、先建一个WCF Service

建一个ServiceContract接口 1 [ServiceContract]

 

public interface IJsonWCFService
 {
     /// <summary>
     /// GetJsonResult
     /// </summary>
     /// <param name="name"></param>
     /// <param name="address"></param>
     /// <param name="phone"></param>
     /// <remarks>
     /// 为实现Json序列化,添加属性
     /// [WebInvoke(ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)]
     /// </remarks>
     /// <returns></returns>
     [OperationContract]
     [WebInvoke(ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)]
     JsonResult GetJsonResult(string name, string address, string phone);
 }

 

实现这个接口

public class JsonWCFService : IJsonWCFService
 {
     #region IJsonWCFService Members
     /// <summary>
     /// Implement the interface
     /// </summary>
     /// <param name="name">Name</param>
     /// <param name="address">Address</param>
     /// <param name="phone">PhoneNumber</param>
     /// <returns>JsonResult</returns>
     public JsonResult GetJsonResult(string name, string address, string phone)
     {
         JsonResult result = new JsonResult(name, address, phone);
         return result;
     }
     #endregion
 }

一个返回的DataContract类

[DataContract]
 public class JsonResult
 {
     /// <summary>
     /// Construct
     /// </summary>
     public JsonResult(string name, string address, string phone)
     {
         _name = string.Format("Name:{0}", name);
         _address = string.Format("Address:{0}", address);
         _phoneNumber = string.Format("PhoneNubmer:{0}", phone);
     }
 
     private string _name;
     /// <summary>
     /// Name
     /// </summary>
     [DataMember]
     public string Name
     {
         get { return _name; }
         set { _name = value; }
     }
     private string _address;
     /// <summary>
     /// Address
     /// </summary>
     [DataMember]
     public string Address
     {
         get { return _address; }
         set { _address = value; }
     }
     private string _phoneNumber;
     /// <summary>
     /// PhoneNumber
     /// </summary>
     [DataMember]
     public string PhoneNumber
     {
         get { return _phoneNumber; }
         set { _phoneNumber = value; }
     }

2、为实现Json序列化设置,我们还得添加一个WebContentTypeMapper

(此类最终会用在Service的配置文件中)

using System.ServiceModel.Channels;
 
 namespace Microsoft.Ajax.Samples
 {
     /// <summary>
     /// JsonContentTypeMapper
     /// 用在配置中<webMessageEncoding webContentTypeMapperType="Microsoft.Ajax.Samples.JsonContentTypeMapper, JsonContentTypeMapper, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
     /// </summary>
     public class JsonContentTypeMapper : WebContentTypeMapper
     {
         public override WebContentFormat GetMessageFormatForContentType(string contentType)
         {
             if (contentType == "text/javascript")
             {
                 return WebContentFormat.Json;
             }
             else
             {
                 return WebContentFormat.Default;
             }
         }
     }
 }

3、添加svc文件,便于发布Service

svc文件其实是十分简单的一个文件,以下是SVC文件中的内容,可以将此文件添加在网站项目的根目录,也可以是一个子目录。对此没有太多的要求。

 <%@ ServiceHost Language="C#" Debug="true" Service="JsonWCFService" %>

4、添加web.config文件

WCFService中相当一部分知识是关于配置的

 

<?xml version="1.0"?>
 <configuration>
   <appSettings/>
   <connectionStrings/>
   <system.web>
 
   </system.web>
   <system.serviceModel>
     <behaviors>
       <endpointBehaviors >
         <behavior name="jsonWcfBehavior">
           <webHttp/>
         </behavior>
       </endpointBehaviors>
     </behaviors>
     <bindings>      
       <customBinding>        
         <binding name="JsonMapper">
           <!--此处配置相当重要,使用了我们编写的JsonContentTypeMapper类,约定返回值类型是Json-->
           <webMessageEncoding webContentTypeMapperType="Microsoft.Ajax.Samples.JsonContentTypeMapper, JsonContentTypeMapper, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
           </webMessageEncoding>
           <httpTransport manualAddressing="true"/>
         </binding>
       </customBinding>
     </bindings>
     <services>      
       <service name="JsonWCFService" >
         <!--注意此处的endpoint配置,address和contract两个属性,在客户端Js调用时会用的上-->
         <endpoint address="ajaxEndpoint" behaviorConfiguration="jsonWcfBehavior"
                   binding="customBinding"
                   bindingConfiguration="JsonMapper" contract="IJsonWCFService">
         </endpoint>
       </service>
     </services>
   </system.serviceModel>
 </configuration>