三种契约
Service契约 包括接口和方法(operation契约)
Data契约 参数,实体,XSD
Message契约 SOAP中的消息格式(还有Fault契约)
WCF异步调用,这个一定要在Client端添加Service Reference时,在高级选项中选择“生成异步调用”才生效,如下所示:
相应的Client代码:
class Program { static int c = 0; static void Main(string[] args) { ServiceReference1.Service1Client client = new ClientConsoleApplication.ServiceReference1.Service1Client(); IAsyncResult arGetData; for (int i = 0; i < 10; i++) { arGetData = client.BeginGetData(1982, GetDataCallback, client); Interlocked.Increment(ref c); } while (c > 0) { Thread.Sleep(1000); Console.WriteLine("Waiting...Calls outstanding:{0}", c); } client.Close(); Console.WriteLine("done"); Console.ReadKey(true); } static void GetDataCallback(IAsyncResult ar) { string str = ((ServiceReference1.Service1Client)ar.AsyncState).EndGetData(ar); Console.WriteLine(c.ToString() + " : " + str); Interlocked.Decrement(ref c); } }
One-Way 只发,不feedback。但是要确保Server接收成功。
今天犯了一个低级错误,写了这么一个契约及其操作:
public interface IService1 { [OperationContract(IsOneWay = true)] string GetDataFast(int value); [OperationContract] string GetDataSlow(int value);
}
然后就不能运行了。这是因为,IsOneWay既然是只发不收的,那么它对应的方法就一定是void返回类型的。
正确的写法是:
public interface IService1 { [OperationContract(IsOneWay = true)] void DoFast(int value); [OperationContract] void DoSlow(int value); }
在Client调用的时候,你会发现,DoFast很快,DoSlow很慢。这是IsOneWay的作用。
Paired One-Way是两个One-Way,而Duplex是一个。
对于双工(Duplex),这里有一个全景图,看明白这个就够了:
建议大家下载我写的游戏大厅,完全是基于WCF Duplex机制的:GamePlatform在CodePlex上正式挂牌