我正在编写一个Silverlight 5客户端要使用的双工服务。我的服务器配置看起来像这样(显然在正确的位置) -
<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();
}
这似乎很好,但我不是百分之百确定。
我的客户端代码如下所示 -
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(result)'时,我收到了ContractFilter不匹配问题,但我不明白为什么。显然在服务器上我正在实现Async接口的同步版本(所以只是Connect而不是Begin / EndConnect),但这是我能想到的唯一一个不匹配合同的地方。
我现在真的把头发拉出来......我已经秃了!任何帮助都会非常感激。
提前致谢。
答案 0 :(得分:2)
请通过明确设置服务接口的名称和名称空间来尝试,不应该由于客户端中不同的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
}
答案 1 :(得分:0)
并且记得将该版本从4.0.0.0更改为5.0.0.0,因为您使用的是SL 5(我假设您已从c:\ Program Files(x86)\ Microsoft加载了正确的System.ServiceModel.PollingDuplex程序集的SDK \ Silverlight的\ V5.0 \库\服务器)