Как правильно вызвать внешнюю службу WCF из SharePoint 2010?

Я хотел бы вызвать внешнюю службу WCF из SharePoint. Использование обычных вызовов WCF немедленно вызывает SocketException (существующее соединение было принудительно закрыто удаленным узлом), которое можно обойти с помощью SPSecurity.RunWithElevatePrivileges.

[SocketException (0x2746): существующее соединение было принудительно закрыто удаленным хостом]
System.Net.Sockets.Socket.Receive (буфер Byte [], смещение Int32, размер Int32, SocketFlags socketFlags) +85
System.ServiceModel.Channels.SocketConnection.ReadCore (буфер Byte [], смещение Int32, размер Int32, тайм-аут TimeSpan, логическое закрытие) +204

[CommunicationException: соединение сокета было прервано. Это может быть вызвано ошибкой при обработке вашего сообщения или превышением тайм-аута приема удаленным узлом, или проблемой базового сетевого ресурса. Тайм-аут локального сокета был «00: 00: 58.7210000».]
System.ServiceModel.Channels.SocketConnection.ReadCore (буфер Byte [], смещение Int32, размер Int32, тайм-аут TimeSpan, логическое закрытие) +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 (буфер байта [], смещение Int32, счетчик Int32) +88
System.Net.FixedSizeReader.ReadPacket (буфер Byte [], смещение Int32, счетчик Int32) +58
System.Net.Security.NegotiateStream.StartFrameHeader (буфер Byte [], смещение Int32, счетчик Int32, AsyncProtocolRequest asyncRequest) +62
System.Net.Security.NegotiateStream.StartReading (буфер Byte [], смещение Int32, счетчик Int32, AsyncProtocolRequest asyncRequest) +54
System.Net.Security.NegotiateStream.ProcessRead (буфер Byte [], смещение Int32, счетчик Int32, AsyncProtocolRequest asyncRequest) +402

[IOException: операция чтения завершилась неудачно, см. Внутреннее исключение.]
System.Net.Security.NegotiateStream.ProcessRead (буфер Byte [], смещение Int32, счетчик Int32, AsyncProtocolRequest asyncRequest) +704
System.Net.Security.NegotiateStream.Read (буфер байта [], смещение Int32, счетчик Int32) +154
System.ServiceModel.Channels.StreamConnection.Read (буфер Byte [], смещение Int32, размер Int32, тайм-аут TimeSpan) +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) +539
MyApp.FunctionThatCallsService ()

Это заставило меня задуматься: SharePoint делает это, и они делают это красиво, когда у них есть индивидуальные конфигурации служб в 14 \ WebClients.

Я отразил и клонировал многие из них (Расширение Методы ChannelFactory используются повсюду внутри себя - SPChannelFactoryOperations ), но мне интересно: являются ли «правильные» API, которые SharePoint использует для вызова своих собственных служб WCF, открытыми для внешнего кода, чтобы я мог вызывать мои службы WCF, не относящиеся к SharePoint, из пользовательского кода SharePoint?

(Это решение фермы, развернутое в GAC, поэтому ни CAS, ни песочница не применяются)

10
задан Michael Stum 11 July 2011 в 21:16
поделиться