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