31.05.2013, 14:52 | #1 |
Moderator
|
Подключение к CRM на чистом WCF через HTTPS
Коллеги, подскажите кто пробовал реализовать подключение к CRM c использованием базовых классов WCF без использования сборок SDK? Важный момент состоит в том, что сервер доступен только по httpS.
Сервер сконфигурирован корректно, так как:
Иными словами требуется код наподобие: X++: String serviceUrl = "https://server/org/XRMServices/2011/Organization.svc"; SymmetricSecurityBindingElement security = new SymmetricSecurityBindingElement(new SspiSecurityTokenParameters()); HttpsTransportBindingElement https = new HttpsTransportBindingElement(); https.MaxReceivedMessageSize = 10000000; CustomBinding binding = new CustomBinding(); binding.Elements.Add(security); binding.Elements.Add(https); OrganizationServiceClient client = new OrganizationServiceClient(binding, new EndpointAddress(serviceUrl)); OrganizationRequest whoAmI = new OrganizationRequest(); whoAmI.RequestName = "WhoAmI"; client.Execute(whoAmI); client.Close(); X++: String serviceUrl = "https://server/org/XRMServices/2011/Organization.svc"; WSHttpBinding b = new WSHttpBinding(); b.Security.Mode = SecurityMode.Transport; b.MaxReceivedMessageSize = 10000000; OrganizationServiceClient client = new OrganizationServiceClient(b, new EndpointAddress(serviceUrl)); OrganizationRequest whoAmI = new OrganizationRequest(); whoAmI.RequestName = "WhoAmI"; client.Execute(whoAmI); client.Close(); Цитата:
An error occurred when verifying security for the message
Server stack trace: at System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation, ProxyRpc& rpc) at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout) at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation) at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message) Exception rethrown at [0]: at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) at CrmWcfTestConsoleApplication.CrmServiceReference.IOrganizationService.Execute(OrganizationRequest request) Буду признателен за помощь всеми возможными очками репутации!
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
01.06.2013, 13:05 | #2 |
Участник
|
Что подразумевается под
Я знаю два способа обращения к сервису CRM (WCF) 1. Сборки SDK 2. клаcсы созданные через svcutil.exe. Есть еще какой-то? Через сборки SDK консул работает? А почему вы не хотите использовать сборки? Можно через ILMERGE собрать все в одну сборку и положить в GAC Или я что-то упускаю?
__________________
Читайте SDK!!! |
|
02.06.2013, 01:34 | #3 |
Moderator
|
Вопрос в том, что сборки SDK используют низлежащие технологии для соединения. Формально они не нужны, значит нет необходимости в различных извращениях.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
02.06.2013, 10:05 | #4 |
Участник
|
Цитата:
Reflector в помощь.
__________________
Читайте SDK!!! |
|
02.06.2013, 10:16 | #5 |
Участник
|
Вернемся к началу
Для того что-бы обратить к WCF, нужно иметь в наличии на стороне request’a интерфейс. Его можно получит несколькими способами 1. Service Reference 2. Скопировать из кода WCF сервиса. (это не ваш случай) А потом по схеме. например вот так http://www.codeproject.com/Articles/...ding-a-Service или так http://huseyincakir.wordpress.com/20...ice-reference/ Вряд ли без интерфейса что-то получится.
__________________
Читайте SDK!!! |
|
03.06.2013, 13:51 | #6 |
Moderator
|
Спасибо. Использовать Service Reference я могу, проблема была только в инициализации клиента. Помог разобраться анализ конфига, создаваемого студией. Проблема была в некорректном создании Security Binding. Ниже рабочий код:
X++: TransportSecurityBindingElement securityElement = SecurityBindingElement.CreateSspiNegotiationOverTransportBindingElement(true); HttpsTransportBindingElement transport = new HttpsTransportBindingElement(); CustomBinding binding = new CustomBinding(); endpointBinding.Elements.Add(securityElement); endpointBinding.Elements.Add(transport); OrganizationServiceClient client = new OrganizationServiceClient(binding, new EndpointAddress(serviceUrl)); OrganizationRequest whoAmI = new OrganizationRequest(); whoAmI.RequestName = "WhoAmI"; client.Execute(whoAmI); client.Close();
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional Последний раз редактировалось Артем Enot Грунин; 03.06.2013 в 13:55. |
|
15.08.2013, 14:57 | #7 |
Moderator
|
Доброго времени суток, коллеги. После установки последних .NET Security Update WCF приведенный выше код перестал работать. Расследование показало, что клиент стал требовать Identity: http://msdn.microsoft.com/en-us/library/ms733130.aspx
Данная статья рассказывает что и почему я должен настроить на своем WCF Endpoint чтобы все корректно взлетело и даже говорит как и почему: http://msdn.microsoft.com/en-us/library/bb628618.aspx. Вопрос: каким, б@#$ь образом продолжают работать готовые утилиты и прокси классы? Дописывать в код что-то вроде: X++: EndpointAddress address = new EndpointAddress(new Uri(serviceUrl), EndpointIdentity.CreateSpnIdentity(@"DOMAIN\CRMAPP"), new AddressHeaderCollection()); OrganizationServiceClient client = new OrganizationServiceClient(endpointBinding, address); Что же не так с моей конфигурацией или кодом? Знает ли кто-то как исправить ошибку?
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия. MS Certified Dirty Magic Professional |
|
|
|