使用WCF POST JSON

今天的项目中需要用到WCF POST JSON数据,曾过几番周折,终于成功。记录于此,供有需要的博友采用。

首先数据的写入一定要有一个供公开的类,这与MVC不同。因为之前,自己一直想做为string 传递,就没有打算多加一个数据传递的类。结果WCF总是得不到数据。远程服务器抛出400的错误代码。原因原来是没有定义一个可供序列化的数据传递的类。定义该类以后,数据就能传递到WCF了。

1.类如下:注意要引用 System.Runtime.Serialization;在客户端也要建立相同的类,序列化写入流中。当然也可以不用建类。但是字段必须相同。传入的值为

<pre name="code" class="csharp"> string inputString = "{\"Parameter\":\"ABCDEFG\"}";
 

[DataContract]
    public class InputPars
    {
        [DataMember]
        public string Parameter { get; set; }
    }
顺便把客户端传递的代码记录一下.这里需要注意的是地址与MVC调用的方法不同。它的前面一定是.svc文件。后面加上实现了接口的方法名称。

<pre name="code" class="csharp"> public void GetName()
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(@"http://localhost/Service.svc/GetData");
            request.ContentType = "application/json";
            request.Method = "POST";
            string inputString = "{\"Key\":\"ABCDEFG\"}";
            Byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(inputString);
            request.ContentLength = byteArray.Length;
            Stream rstream = request.GetRequestStream();
            rstream.Write(byteArray, 0, byteArray.Length);
            rstream.Close();


            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            Stream stream = response.GetResponseStream();
            StreamReader SR = new StreamReader(stream);
            String info = SR.ReadToEnd();
            SR.Dispose();
            Assert.IsNotNull(info);

        }


 

2.有些协议不支持post方法,这里还需要对配置文件 进行设置,例它支持post方法。这里的重点是使用webHttpBinding,和两个行为配置 behaviorConfiguration。注意由于有些终结点是需要不同的协议。因此为单独的终结点配置行为。

<system.serviceModel>
    <services>
      <service name="JHDWCFService.Service" behaviorConfiguration="MyServiceBehavior">
        <endpoint address="" binding="webHttpBinding" bindingConfiguration="" behaviorConfiguration="webBehavior"
          name="O2OService" contract="JHDWCF.Contract.Sys.ISysInput" />
      </service>
    </services>
    <behaviors>
      <endpointBehaviors >
        <behavior name="webBehavior" >
          <webHttp  />
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="MyServiceBehavior">
          <!-- 为避免泄漏元数据信息,请在部署前将以下值设置为 false -->
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
          <!-- 要接收故障异常详细信息以进行调试,请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息 -->
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <protocolMapping>
        <add binding="basicHttpsBinding" scheme="https" />
    </protocolMapping>    
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>

3.至此服务端能够接收json数据了。但是我们希望返回的也是json数据。这个时候需要在Contract中去处理。注意要引用 System.ServiceModel.Web。返回的string对象是采用newtown.json序列化的对象。在这里,如果返回的数据不是string,而是一个对象,比如定义的person,那么程序会自动序列化为json返回。不用自己再去序列化对象了。

 [ServiceContract]
    public interface ISysInput
    {
        
        [OperationContract]
        [WebInvoke(RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, Method = "POST")]
        string HttpService(JHDWCF.Model.InputPars pars);

    }
记录完毕。





  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值