14.12.2012, 19:54 | #1 |
Участник
|
Невозможность присоединения к Organization.svc из web-сервиса
В общем, есть web-сервис, часть методов которого работают как обычные отчёты (выгружают данные процедур отчёта напрямую из базы, в обход сервиса CRM), и есть методы, использующие Organization.svc.
Так вот все методы сервиса работают без проблем, если 1) Запускаются с локального IIS'а (нажатием на "Invoke" в браузере) 2) Работают из тестового приложения, которое деплоит сервис, подключенный из "соседнего" проекта в том же солюшене. (Вэб-ссылка добавляется "из проекта"). Но стоит подключить тот же самый веб-сервис из тестового приложения по ссылке на тот же локальный IIS (http://localhost:777/ReportsService.asmx), как он падает при попытке достучаться к Organization.svc со следующим ругательством: "System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> System.InvalidOperationException: Metadata contains a reference that cannot be resolved: 'http://servername/Organization.svc?wsdl'. ---> System.Net.WebException: The remote name could not be resolved: 'servername' at System.Net.HttpWebRequest.GetResponse() at System.ServiceModel.Description.MetadataExchangeClient.MetadataLocationRetriever.DownloadMetadata(TimeoutHelper timeoutHelper) at System.ServiceModel.Description.MetadataExchangeClient.MetadataRetriever.Retrieve(TimeoutHelper timeoutHelper)" При этом другие методы (работающие с базой напрямую, без подключения к CRM'у) продолжают работать как положено. Ради теста вынесла кусок кода, в котором происходит поломка, в отдельный веб-метод, захардкодив для верности строку подключения: Код: [WebMethod(Description = "Тестируем глючное место")] public void TestImpers() { IntPtr token = ((WindowsIdentity)User.Identity).Token; WindowsImpersonationContext context = WindowsIdentity.Impersonate(token); string imp = WindowsIdentity.GetCurrent().Name; Uri organizationUri = new Uri("http://____________Organization.svc"); var cred = new ClientCredentials(); //---вот на этой строчке ломается OrganizationServiceProxy _serviceproxy = new OrganizationServiceProxy(organizationUri, null, cred, null); } Может с IISом как-то колдовать по-хитрому надо? |
|
14.12.2012, 22:25 | #2 |
Участник
|
Цитата:
Сообщение от Violette
В общем, есть web-сервис, часть методов которого работают как обычные отчёты (выгружают данные процедур отчёта напрямую из базы, в обход сервиса CRM), и есть методы, использующие Organization.svc.
Так вот все методы сервиса работают без проблем, если 1) Запускаются с локального IIS'а (нажатием на "Invoke" в браузере) 2) Работают из тестового приложения, которое деплоит сервис, подключенный из "соседнего" проекта в том же солюшене. (Вэб-ссылка добавляется "из проекта"). Но стоит подключить тот же самый веб-сервис из тестового приложения по ссылке на тот же локальный IIS (http://localhost:777/ReportsService.asmx), как он падает при попытке достучаться к Organization.svc со следующим ругательством: "System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> System.InvalidOperationException: Metadata contains a reference that cannot be resolved: 'http://servername/Organization.svc?wsdl'. ---> System.Net.WebException: The remote name could not be resolved: 'servername' at System.Net.HttpWebRequest.GetResponse() at System.ServiceModel.Description.MetadataExchangeClient.MetadataLocationRetriever.DownloadMetadata(TimeoutHelper timeoutHelper) at System.ServiceModel.Description.MetadataExchangeClient.MetadataRetriever.Retrieve(TimeoutHelper timeoutHelper)" При этом другие методы (работающие с базой напрямую, без подключения к CRM'у) продолжают работать как положено. Ради теста вынесла кусок кода, в котором происходит поломка, в отдельный веб-метод, захардкодив для верности строку подключения: Код: [WebMethod(Description = "Тестируем глючное место")] public void TestImpers() { IntPtr token = ((WindowsIdentity)User.Identity).Token; WindowsImpersonationContext context = WindowsIdentity.Impersonate(token); string imp = WindowsIdentity.GetCurrent().Name; Uri organizationUri = new Uri("http://____________Organization.svc"); var cred = new ClientCredentials(); //---вот на этой строчке ломается OrganizationServiceProxy _serviceproxy = new OrganizationServiceProxy(organizationUri, null, cred, null); } Может с IISом как-то колдовать по-хитрому надо? Вы хотите сказать, что ваше решение, которое обращается к сервису срм работает только локально? (то есть когда находится физически на том же сервере что и срм) Обычная ссылка веб клиента открывается с удаленного сервера? Ссылка сервиса отрывается с удаленного сервера? Если используете в ссылке имя сервера, попробуйте вместо имени прописать ip. Попробуйте отключить firewall на сервере срм.
__________________
Читайте SDK!!! |
|
17.12.2012, 12:58 | #3 |
Участник
|
Цитата:
Различие в способах вызова самого решения (моего вэб-сервиса, вызывающего сервис CRM). 1) Мой сервис запускается прямо в браузере с локального IIS'а (на моей машине, отличной от той, на которой запускается CRM) и его методы доступны для вызова через INVOKE. В этом случае проверка проходит успешно. 2) Проект моего сервиса и считывающий его тестовый проект находятся в одном солюшне. Ссылка смервиса добавляется в Service References тестового проекта как "Discover -> Services in Solution". В этом случае студия сама решает, куда захостить сервис, и запускает его не с IIS'а (там он стабильно висит на localhost:777), а откуда-то из файловой системы c адреса localhost:1228, который в следующий раз может быть и другим (таким, каким его назначит вижуал студия). В этом случае тоже работает. 3) А вот если выкину из солюшна проект сервиса и подключу свой веб-сервис к Service References тестового проекта через его вызов с IIS'а (путём прописывания адреса localhost:777), то сам сервис и его методы, работающие напрямую с базой, работать будут, но те методы, которые содержат в себе подключение к Organization.svc, упадут с ошибкой "Metadata contains a reference that cannot be resolved: 'http://servername/Organization.svc?wsdl'". При том, что в двух других выше описанных случаях этот момент замечательно отрабатывал. Вот.(( |
|
|
|