WCF处置不同方式提交的数据的方法

WCF处理不同方式提交的数据的方法

最近由于项目需要,涉及了一些WCF的编程,发现功能很好很强大。尤其是对于XML和JSON的支持,使得面向对象的操作进一步简化,下载并导入NewtonSoft.json使用其JsonConvert类的序列化和反序列化方法,可以在json和对象之间转换,只需要一句代码就能完成。

但是WCF对提交表单的数据让我忙活了好久,由于程序是要和第三方软件适配,对方的web service使用java编写,提供了java下的客户端的程序实例。经过反复测试,才发现其需要的数据,是表单数据与json数据相结合。由于理解偏差导致折腾了许久,自己建了模拟服务器,又安装了eclipse运行第三方提供的客户端代码,验证模拟服务器的正确性,然后基于模拟服务器编写C#的客户代码。

对这几天的工作中涉及的WCF相关知识做一个梳理:

1.服务器端可指明需求数据格式和反馈数据格式,通过特性注明,比如:

[OperationContract]
        [WebInvoke(UriTemplate = "update", Method = "POST",
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json)]

public UpdateData Post(UpdateData author)
        {
            
            return null;
        }

此段代码指明需求和相应数据格式均为Json格式,采用POST方式提交数据。

WebMessageFormat枚举有两个值,除了Json还有XML。

采用这两种时,服务器段的函数参数及代码中直接使用对象即可。

2.客户端在提交数据时,根据设定的值将数据序列化为Json或xml;在获取数据时将数据反序列化为对象。代码如下:

HttpClient client = new HttpClient(new Uri(uri));

client.DefaultRequestHeaders.Accept.Add(
                        new MediaTypeWithQualityHeaderValue("application/json"));

var request = new HttpRequestMessage(HttpMethod.Post, new Uri(uri));
            request.Content = new ObjectContent<UpdateData>(user, "application/json");
            request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            HttpResponseMessage response2 = client.Send(request);
            var receivedAuthor = response2.Content.ReadAs<UpdateData>();

3.若服务器端需要接受form表单提交数据的方式,则代码可这样来写:

[OperationContract]
    [WebInvoke(UriTemplate = "invoke",Method="POST")]
    void DoWork(Stream input)

{
        StreamReader sr = new StreamReader(input);
        string s = sr.ReadToEnd();
        sr.Dispose();


        NameValueCollection qs = HttpUtility.ParseQueryString(s);
        string xx = qs["measValData"];
       
    }

上述方法中,参数不再是具体对象类型,而是接受数据流。从数据流读取之后,解析为NameValue集合,从中自行获取需要的参数值。

4.这时客户端可采用的实现方法有这样两种:

System.Net.WebClient client= new System.Net.WebClient();

client.Headers.Add(HttpRequestHeader.ContentType, "application/x-www-form-urlencoded");
        
   System.Collections.Specialized.NameValueCollection PostVars  = new System.Collections.Specialized.NameValueCollection();
   PostVars.Add("A1","0");
   PostVars.Add("A2","0");
   PostVars.Add("A3","000");

   try
   {
    byte[] byRemoteInfo   = client.UploadValues(url,"POST",PostVars);
    string sRemoteInfo   = System.Text.Encoding.Default.GetString(byRemoteInfo); 
   }
   catch
   {}

第二种方法略显繁琐:

string url = "网址";
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
string s = "要提交的数据";
byte[] requestBytes = System.Text.Encoding.ASCII.GetBytes (LoginInfo);
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
req.ContentLength = requestBytes.Length;
Stream requestStream = req.GetRequestStream();
requestStream.Write(requestBytes,0,requestBytes.Length);
requestStream.Close();
HttpWebResponse res = (HttpWebResponse)req.GetResponse();
StreamReader sr = new StreamReader(res.GetResponseStream(), System.Text.Encoding.Default);
string backstr = sr.ReadToEnd(); Response.Write(line); sr.Close(); res.Close(); 

第二种方法需要自行组合好要提交的数据,“parameter1=value1&parameter2=value2"这样的数据。如果某个参数的值比较复杂,请提前序列化,在服务器端也不要忘记获取此参数后反序列化。

简单总结到此,尚未深入研究,仅略知皮毛,作为笔记以便日后使用。