IOutputStreamService.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using System.IO;
using System.Net;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Data;
using System.Drawing;
namespace WcfStream
{
[ServiceContract]
public interface IOutputStreamService
{
[OperationContract]
Stream OutStream(Stream s);
[OperationContract]
string GetStr(string str);
[OperationContract]
void OutArgs(out string outstr1, out string outstr2, out string outstr3);
[OperationContract]
void InArgs(ref string refstr);
[OperationContract]
void RefOutArgs(ref string refstr, out string outstr); //先有传入参数,后有传出参数
[OperationContract]
void OutRefArgs(out string outstr, ref string refstr); //先有传入参数,后有传出参数
[OperationContract]
void GetDataTableByRefArgs(out DataTable datatable, ref string sql);
//[OperationContract]
//void GetImgFromClient(Bitmap img); 错误 Bitmap类型不能传递
}
}
OutputStreamService.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using System.IO;
using System.Net;
using Microsoft.Win32;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Data;
using System.Drawing;
namespace WcfStream
{
public class OutputStreamService : IOutputStreamService
{
public Stream OutStream(Stream s)
{
//IntPtr FileP = File.Open(@"C:\1.mp3", FileMode.OpenOrCreate, FileAccess.Read).Handle;
//s = new FileStream(FileP, FileAccess.Read);
return s;
}
public string GetStr(string str)
{
//Console.WriteLine(str);
//str = "ABC";
return str;
}
public void OutArgs(out string outstr1, out string outstr2, out string outstr3)
{
outstr1 = "第一个out参数.";
outstr2 = "第二个out参数.";
outstr3 = "第三个out参数.";
}
public void InArgs(ref string RefStr)
{
RefStr += "服务器端自己加点料."; //ResStr 初始值是客户端赋予的,客户端可以进一步处理
//MessageBox.Show(RefStr);
}
public void RefOutArgs(ref string refstr, out string outstr)
{
outstr = refstr;
//MessageBox.Show(outstr);
}
public void OutRefArgs(out string outstr, ref string refstr) //先有传入参数,后有传出参数
{
//outstr = "服务器给传出值";
outstr = refstr; //传出值由传入值赋值
//MessageBox.Show(outstr);
}
public void GetDataTableByRefArgs(out DataTable datatable, ref string sql)
{
SqlConnection conn = new SqlConnection(@"Data Source=WIN-1DHKKCMTGTE\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True");
conn.Open();
SqlDataAdapter sda = new SqlDataAdapter(sql, conn);
DataSet ds = new DataSet();
sda.Fill(ds);
datatable = ds.Tables[0];
}
public void GetImgFromClient(Bitmap img) //没有ref和out修饰的参数,谁调用谁给值,这点要记清楚!
{
img.Save(@"C:\111.jpg");
}
}
}
调用代码Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.IO;
using System.Windows.Forms;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
ServiceReference1.OutputStreamServiceClient sc = new ConsoleApplication1.ServiceReference1.OutputStreamServiceClient();
Console.WriteLine(sc.GetStr("客户端赋值的字符串!"));
#region out 参数 begin 【out参数传递方向是从定义方法的地方开始传到调用方法的地方】
string outstr1;
string outstr2;
string outstr3;
outstr1 = sc.OutArgs(out outstr2, out outstr3); //outstr1跑哪儿去了?第一个参数这边成了函数的执行返回值
Console.WriteLine(outstr1 + ":" + outstr2 + ":" + outstr3);
#endregion
#region Ref 参数 begin 【ref参数叫传入参数,所以开始要有初始化,并且由被调用方给予初值】
string instr1 = "Ref参数的值由客户端赋值";
sc.InArgs(ref instr1);
#endregion
#region Ref-Out 参数 begin
string refstr = "客户端是老大,老大给初值";
string outstr;
//Console.WriteLine(sc.OutInArgs(ref refstr,out outstr)); //看看输出结果是什么? 错误,函数返回值是第一个参数?
sc.RefOutArgs(ref refstr, out outstr);
#endregion
#region Out-Ref 参数 begin
//sc.OutRefArgs(ref refstr);
Console.WriteLine(sc.OutRefArgs(ref refstr)); //out参数此时成了函数返回值
#endregion Out-Ref 参数 end //参数里只要有ref,函数里ref的值优先于out得到值
#region 传入 sql 得到 查询结果
string sql = "select top 10 * from orders";
Console.WriteLine(sc.GetDataTableByRefArgs(ref sql).Rows[0][0]);
#endregion
Console.ReadLine();
}
}
}