wcf PerSession(Wshttpbinding)与可移植类库(PCL)

时间:2018-01-27 08:19:15

标签: wcf portable-class-library wshttpbinding

似乎Portable Class Library不支持此所需的PerSession(Wshttpbinding)。

这有什么工作吗?

我有xamarin表单应用程序(服务器客户端),用户可以连接到他们自己的数据库并获取或更新数据。 一旦用户提供他的用户名和密码,一些信息必须存储到他们的会话中,如数据库连接字符串,当来自用户的数据请求时,存储到他的会话的相应连接字符串将用于该数据库并发回数据。

否则没有持久性我必须从客户端传递每个函数的连接字符串。

我怎么能避免这个?可移植类库不支持wshttpbinding,因此我不能使用PerSession

任何帮助?

1 个答案:

答案 0 :(得分:0)

头痛太多

对于使用以下组合的人来说,障碍太多了

  • Xamarin表格
  • PCL(Portable Class Libray)
  • WCF
  • IClientMessageInspector

问题:

我需要一个多客户端应用程序,每个应用程序都可以连接到他自己的数据库(所有模式都相同)

为此目的,我希望在会话级别存储一些信息,如(连接字符串,用户信息),所以当一个方法调用以了解我将从哪个数据库中检索数据时。

问题#1 (花了我5天的时间来理解和实现)

  • Sessions无法使用PCL( WCF PerSession )为什么?因为PerSession需要WsHttpBinding但PCL不支持WsHttpBinding只有BasicHttp

问题#2 (花了3天时间才明​​白为什么不工作)

  • 然后我在这里和那里看到很多关于实现 IClientMessageInspector 的帖子(在线查看示例如何实现IClientMessageInspector它很容易)所以每次一个客户端请求调用以向服务器发送一些额外的信息以及我的情况下的调用是connectionString。在这里,我得到一个例外

    NotImplementedException。为什么?因为MONO中的这个BUG https://bugzilla.xamarin.com/show_bug.cgi?id=40064

用简单的话说

在PCL(目标.NET Core)中创建WCF客户端时,必须使用EndpointBehaviors而不是Behaviors。这在Windows RT应用程序中运行良好,但是Mono没有实现这一点,因此在Android和iOS中生成NotImplementedException。

答案在上面的链接上是另一个人的回复,我感谢他。

简单来说就是

而不是

    MyService.Endpoint.EndpointBehaviors(New MyBehavior)

使用

    Dim prop = MyService.Endpoint.GetType.GetTypeInfo.GetDeclaredProperty("Behaviors")
    Dim obj = CType(prop.GetValue(MyService.Endpoint), KeyedCollection(Of Type, IEndpointBehavior))
    obj.Add(New Behavior)

而不是

clientRuntime.ClientMessageInspectors.Add(New MyInspector)

使用

Public Sub ApplyClientBehavior(endpoint As ServiceEndpoint, clientRuntime As ClientRuntime) Implements IEndpointBehavior.ApplyClientBehavior
    Dim prop = clientRuntime.GetType.GetTypeInfo.GetDeclaredProperty("MessageInspectors")
    Dim obj = CType(prop.GetValue(clientRuntime), ICollection(Of IClientMessageInspector))
    obj.Add(New MyInspector)
End Sub

配置文件无需更改

希望有一天能帮到别人。