今天的项目中需要用到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);
}
记录完毕。