首页 > Asp.net开发 > 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"这样的数据。如果某个参数的值比较复杂,请提前序列化,在服务器端也不要忘记获取此参数后反序列化。

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


本文固定链接: http://www.devba.com/index.php/archives/3253.html | 开发吧

报歉!评论已关闭.