Я хотел бы вызвать внешнюю службу 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 (буфер Byte [], смещение 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, ни песочница)