关于契约

三种契约

Service契约 包括接口和方法(operation契约)

Data契约     参数,实体,XSD

Message契约 SOAP中的消息格式(还有Fault契约)

WCF异步调用,这个一定要在Client端添加Service Reference时,在高级选项中选择“生成异步调用”才生效,如下所示:

image

相应的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),这里有一个全景图,看明白这个就够了:
image 
 
建议大家下载我写的游戏大厅,完全是基于WCF Duplex机制的:GamePlatform在CodePlex上正式挂牌
原文地址:https://www.cnblogs.com/Jax/p/1590505.html