Если вы не используете svcutil, вы можете сделать это легко. Если ваш сервисный интерфейс используется совместно с Silverlight и .Net 3.5, просто используйте простой код для создания клиента во время выполнения.
Примечание. Вам потребуется создать два слегка отличающихся интерфейса, поскольку 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
}
Это позволяет вам вызывать myClient.BeginHelloWorld () и myClient.EndHelloWorld () при использовании Silverlight или просто myClient.HelloWorld () при использовании .Net 3.5.
Если у вас много настраиваемых привязок, вы также можете создать класс, наследующий от 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 });
}
}