Как я могу создать файл WCF .cs для Silverlight и .NET? - PullRequest
2 голосов
/ 04 мая 2011

В настоящее время я использую версию svcutil для Silverlight для создания файла .cs для Silverlight.Я хотел бы поделиться этим с .NET 3.5, но, похоже, есть некоторые препятствия.Примечательно, что ChannelBase, похоже, не существует в .NET, как и IHttpCookieContainerManager.Можно ли вылечить мой файл Service.cs, чтобы он мог быть прочитан обоими?(Я предпочитаю не использовать файл .config.)

1 Ответ

1 голос
/ 04 мая 2011

Если вы не используете 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 });
    }
}
...