Как правильно вызвать внешнюю службу WCF из SharePoint 2010? - PullRequest
10 голосов
/ 08 июля 2011

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

Ответы [ 2 ]

2 голосов
/ 18 июля 2011

Закончилось сохранение раздела SPSecurity.RunWithElevatedPrivileges.SPChannelFactoryOperations от Microsoft в какой-то момент натолкнулся на исключение NullReferenceException, скорее всего, из-за утверждений, которые необходимо настроить в службе, даже если она не используется (SPServiceAuthenticationMode имеет только SPServiceAuthenticationMode.Claims в качестве участника. Тот факт, что CreateChannelActingAsLoggedOnUser() немедленно вызываетArgumentException - это сигнал о том, что SPChannelFactoryOperations не предназначен для использования кодом не от Microsoft.

0 голосов
/ 12 июля 2011

Я рекомендую пытаться игнорировать сертификаты.

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

Возможно, вам нужен прокси?У вас проблемы с портами?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...