如何从SharePoint 2010正确调用外部WCF服务?

时间:2011-07-08 00:23:13

标签: c# .net sharepoint sharepoint-2010

我想从SharePoint中调用外部WCF服务。使用普通的WCF调用会立即导致SocketException(现有连接被远程主机强行关闭),可以使用SPSecurity.RunWithElevatePrivileges来规避它。

  

[SocketException(0x2746):远程主机强行关闭现有连接]      System.Net.Sockets.Socket.Receive(Byte []缓冲区,Int32偏移量,Int32大小,SocketFlags socketFlags)+85
     System.ServiceModel.Channels.SocketConnection.ReadCore(Byte [] buffer,Int32 offset,Int32 size,TimeSpan timeout,Boolean closing)+204

     

[CommunicationException:套接字连接中止。这可能是由于处理消息的错误或远程主机超出接收超时或基础网络资源问题引起的。本地套接字超时为'00:00:58.7210000'。]      System.ServiceModel.Channels.SocketConnection.ReadCore(Byte [] buffer,Int32 offset,Int32 size,TimeSpan timeout,Boolean closing)+15307563
     System.ServiceModel.Channels.SocketConnection.Read(Byte []缓冲区,Int32偏移量,Int32大小,TimeSpan超时)+90
     System.ServiceModel.Channels.DelegatingConnection.Read(Byte []缓冲区,Int32偏移量,Int32大小,TimeSpan超时)+34
     System.ServiceModel.Channels.ConnectionStream.Read(Byte []缓冲区,Int32偏移量,Int32计数,TimeSpan超时)+34
     System.ServiceModel.Channels.ConnectionStream.Read(Byte []缓冲区,Int32偏移量,Int32计数)+88
     System.Net.FixedSizeReader.ReadPacket(Byte []缓冲区,Int32偏移量,Int32计数)+58
     System.Net.Security.NegotiateStream.StartFrameHeader(Byte [] buffer,Int32 offset,Int32 count,AsyncProtocolRequest asyncRequest)+62
     System.Net.Security.NegotiateStream.StartReading(Byte []缓冲区,Int32偏移量,Int32计数,AsyncProtocolRequest asyncRequest)+54
     System.Net.Security.NegotiateStream.ProcessRead(Byte [] buffer,Int32 offset,Int32 count,AsyncProtocolRequest asyncRequest)+402

     

[IOException:读取操作失败,请参阅内部异常。]
     System.Net.Security.NegotiateStream.ProcessRead(Byte [] buffer,Int32 offset,Int32 count,AsyncProtocolRequest asyncRequest)+704
     System.Net.Security.NegotiateStream.Read(Byte []缓冲区,Int32偏移量,Int32计数)+154
     System.ServiceModel.Channels.StreamConnection.Read(Byte [] buffer,Int32 offset,Int32 size,TimeSpan timeout)+87

     

[CommunicationException:套接字连接中止。这可能是由于处理消息的错误或远程主机超出接收超时或基础网络资源问题引起的。本地套接字超时为'00:00:58.7210000'。]      System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg,IMessage retMsg)+10257978
     System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData,Int32 type)+539
     MyApp.FunctionThatCallsService()

这让我想到了:SharePoint做到了,并且他们以一种很好的方式实现了这一点,他们在14 \ WebClients中拥有单独的服务配置。

我反思并克隆了很多(ChannelFactory上的扩展方法在内部使用 - SPChannelFactoryOperations),但我想知道:SharePoint使用的“适当”API是否属于它自己的WCF服务暴露给外部代码,以便我可以从自定义SharePoint代码调用我的非SharePoint WCF服务?

(这是部署到GAC的服务器场解决方案,因此CAS和沙盒都不适用)

2 个答案:

答案 0 :(得分:2)

最后保留SPSecurity.RunWithElevatedPrivileges部分。 Microsoft的SPChannelFactoryOperations在某些时候遇到了NullReferenceException,很可能是因为即使不使用它也需要在服务中设置声明(SPServiceAuthenticationMode只有SPServiceAuthenticationMode.Claims作为成员。 CreateChannelActingAsLoggedOnUser()立即抛出ArgumentException是一个信号,SPChannelFactoryOperations不应由非Microsoft代码使用。

答案 1 :(得分:0)

我建议您尝试忽略证书。

http://www.fryan0911.com/2006/07/vbnet-how-to-accept-web-service-ssl.html

也许您需要代理?你有某种类型的端口阻塞问题吗?