PollingDuplexHTTPBINDING и DuplexChannelfactory - несоответствие контрактных условиях на конечномОтучкесфере

StackOverflow https://stackoverflow.com/questions/9464313

Вопрос

Я пишу дуплексную службу, которая должна потребляться клиентом Silverlight 5.Мой сервер Config выглядит так (в нужных местах) -

            <bindingExtensions>
                <add name="pollingDuplexHttpBinding"
                     type="System.ServiceModel.Configuration.PollingDuplexHttpBindingCollectionElement, System.ServiceModel.PollingDuplex, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
            </bindingExtensions>

<pollingDuplexHttpBinding>
                <binding name="multipleMessagesPerPollPollingDuplexHttpBinding"
                         duplexMode="MultipleMessagesPerPoll"
                         maxOutputDelay="00:00:07"/>
            </pollingDuplexHttpBinding>

<endpoint address="Duplex"
                          binding="pollingDuplexHttpBinding"
                          bindingConfiguration="multipleMessagesPerPollPollingDuplexHttpBinding"
                          contract="ProActive.Domain.Interfaces.IDuplexService"/>
.

Контракт, который вы видите, есть это -

[ServiceContract(Name = "IDuplexService", CallbackContract = typeof(IDuplexClient))]
    public interface IDuplexServiceAsync
    {
        [OperationContract(AsyncPattern = true)]
        IAsyncResult BeginConnect(int userId, AsyncCallback callback, object asyncState);

        void EndConnect(IAsyncResult result);
    }

[ServiceContract]
public interface IDuplexClient
{
    [OperationContract(IsOneWay = true)]
    void Refresh();
}
.

Это, кажется, проходит просто хорошо, но я не на 100% уверен в этом.

Мой код клиента выглядит так -

public class client : IDuplexClient
{
    #region IDuplexClient Members

    public void Refresh()
    {

    }

    #endregion
}



 public someOtherClass
    {
var binding = new PollingDuplexHttpBinding();
            binding.DuplexMode = PollingDuplexMode.MultipleMessagesPerPoll;

            var address = new EndpointAddress("http://" + ConfigService.ServerName + "/Service.svc/Duplex/");

            var factory = new DuplexChannelFactory<IDuplexServiceAsync>(
                new InstanceContext(new client()), binding).CreateChannel(address);
            factory.BeginConnect(0, new AsyncCallback((result) =>
                {
                    factory.EndConnect(result);

                }), null);

    }
.

Я получаю проблему несоответствия контракта, когда я шагу на «Factory.endConnect (результат)», но я не понимаю, почему.Очевидно, на сервере я реализую синхронную версию ASYNC-интерфейса (так просто подключиться и не начинать / EndConnect), но это единственное место, о котором я могу подумать, что существует несоответствующий контракт.

Я действительно вытягивая волосы сейчас ... и я уже лысый!Любая помощь будет очень ценится.

Спасибо заранее.

Это было полезно?

Решение

Пожалуйста, попробуйте его, предполагаемое настроить название и пространства имен ваших сервисных интерфейсов, у вас не должно быть проблему в несоответствии из-за различных пространств имен CLR в клиентеи сервер.

[ServiceContract(Name = "IClient", Namespace = "http://your.namespace")]
public interface IClient
{
    [OperationContract(IsOneWay = true)]
    void DoSomething();

    [OperationContract(IsOneWay = true)]
    void DoSomethingElse();
}

[ServiceContract(Name = "IServer", Namespace = "http://your.namespace", CallbackContract = typeof(IClient))]
public interface IServer
{
#if !SILVERLIGHT
    [OperationContract]
    string Operation1(string userName);

    [OperationContract]
    int Operation2(int x, int y);
#else
    [OperationContract(AsyncPattern = true)]
    IAsyncResult BeginOperation1(string userName, AsyncCallback callback, object state);
    string EndOperation1(IAsyncResult asyncResult);

    [OperationContract(AsyncPattern = true)]
    IAsyncResult BeginOperation2(int x, int y, AsyncCallback callback, object state);
    int EndOperation2(IAsyncResult asyncResult);
#endif
}
.

Другие советы

И не забудьте изменить эту версию из 4.0.0.0 до 5.0.0.0, поскольку вы используете SL 5 (и я предполагаю, что вы загрузили правильную систему .serviceModel.pollingDupplex assuse из C: \ программных файлов (x86) \ MicrosoftSdks \ Silverlight \ v5.0 \ библиотеки \ server)

.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top