如何为Silverlight和.NET生成WCF .cs文件?

时间:2011-05-04 19:04:14

标签: c# .net silverlight wcf svcutil.exe

我目前使用Silverlight版本的svcutil为Silverlight生成.cs文件。我希望能够与.NET 3.5分享这一点,但似乎存在一些障碍。值得注意的是,ChannelBase似乎不存在于.NET中,IHttpCookieContainerManager也不存在。是否可以为我的Service.cs提供医生服务,以便两者都可以阅读? (我不想使用.config文件。)

1 个答案:

答案 0 :(得分:1)

如果您不使用svcutil,则可以轻松完成此操作。如果您的服务接口由Silverlight和.Net 3.5共享,则只需使用一些simple code在运行时创建客户端。

注意:您需要创建两个略有不同的接口,因为Silverlight仅支持异步通信。或者您可以使用相同的接口并使用#if SILVERLIGHT告诉编译器在编译Silverlight代码时只编译文件的一部分,在编译.NET代码时编译文件的另一部分。一个例子:

[ServiceContract(Namespace="http://www.example.com/main/2010/12/21")]
public interface IService
{
#if SILVERLIGHT
        [OperationContract(AsyncPattern=true, Action = "http://www.example.com/HelloWorld", ReplyAction = "http://www.example.com/HelloWorldReply")]
        IAsyncResult BeginHelloWorld(AsyncCallback callback, object state);
        string EndHelloWorld(IAsyncResult result);
#else
        [OperationContract(Action="http://www.example.com/HelloWorld", ReplyAction="http://www.example.com/HelloWorldReply")]
        string HelloWorld();
#endif
}

这允许您在使用Silverlight时调用myClient.BeginHelloWorld()和myClient.EndHelloWorld(),或者在使用.Net 3.5时调用myClient.HelloWorld()。

如果你有很多自定义绑定,你也可以创建一个继承自CustomBinding的类,并在.Net和Silverlight之间共享该类。这样一个类的一个例子:

public class MyServiceBinding : CustomBinding
{
    public MyServiceBinding()
    {
        BinaryMessageEncodingBindingElement binaryEncodingElement = new BinaryMessageEncodingBindingElement();

#if !SILVERLIGHT
        binaryEncodingElement.ReaderQuotas.MaxArrayLength = int.MaxValue;
#endif

        Elements.Add(binaryEncodingElement);
        Elements.Add(new HttpTransportBindingElement() { MaxReceivedMessageSize = int.MaxValue });
    }
}