2012-02-29 2 views
0

Я создал простую службу wcf, которая извлекает данные из crm 4.0 с помощью расширенных инструментов разработчика. Я успешно запросил данные с помощью linq. Классы создавались с использованием crmsvcutil. Однако, когда я преобразовал это в службу wcf, как показано ниже, он продолжает сбой.crm расширенные инструменты разработчика в сочетании с WCF не работает

namespace CRMDataRetrieval 
{  
[ServiceContract] 
public interface ICRMData 
{ 
    [OperationContract] 
    string getValue(); 

} 

public class CRMDataService : ICRMData 
{ 
    public string getValue() 
    { 
     DataContext context = new DataContext("entities"); //entities is name of classes that were generated by crmsvcutil 

     string name = null; 
     var query = from n in context.contacts 
        where n.acctNum == "01218515" 
        select n.nickname; 
     foreach (var result in query) 
      name = result; 
     return name; 
    } 

В хост службы WCF, служба остановлена, но он также показывает, как Entities.CmsDataService остановки, а также. Когда я нажимаю на это, в дополнительной информации говорится, что услуга (Entities.CmsDataService) не может быть запущена. Эта служба не имеет конечной точки. Добавьте еще один конечный пункт для службы в файле конфигурации и повторите попытку.

Как все выглядит, мой app.config выглядит ниже. Итак, как и где я могу добавить конечные точки в файле конфигурации для автоматически генерируемых классов, чтобы они хорошо работали с WCF? или мне нужно будет внести какие-либо другие изменения? Пожалуйста, детализируйте свое объяснение. Как обычно, благодарим вас заранее.

<?xml version="1.0"?> 
<configuration> 
    <configSections> 
    </configSections> 
    <connectionStrings> 
    <add name="entities" connectionString="Authentication Type=ad; Server=http://****; User ID=*\*******; Password=*******"/> 
    </connectionStrings> 
    <system.web> 
    <compilation debug="true"/> 
    </system.web> 
    <!-- When deploying the service library project, the content of the config file must be added to the host's 
    app.config file. System.Configuration does not support config files for libraries. --> 
    <system.serviceModel> 
    <bindings /> 
    <client /> 
    <services> 
     <service name="CRMDataRetrieval.CRMDataService"> 
     <host> 
      <baseAddresses> 
      <add baseAddress="http://localhost:7432/account"/> 
      </baseAddresses> 
     </host> 
     <!-- Service Endpoints --> 
     <!-- Unless fully qualified, address is relative to base address supplied above --> 
     <endpoint name="wsHttpBinding_ICRMData" address="ws" binding="wsHttpBinding" contract="CRMDataRetrieval.ICRMData"/> 


     <!-- Metadata Endpoints --> 
     <!-- The Metadata Exchange endpoint is used by the service to describe itself to clients. --> 
     <!-- This endpoint does not use a secure binding and should be secured or removed before deployment --> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior> 
      <!-- To avoid disclosing metadata information, 
      set the value below to false and remove the metadata endpoint above before deployment --> 
      <serviceMetadata httpGetEnabled="True"/> 
      <!-- To receive exception details in faults for debugging purposes, 
      set the value below to true. Set to false before deployment 
      to avoid disclosing exception information --> 
      <serviceDebug includeExceptionDetailInFaults="False"/> 
     </behavior> 
     </serviceBehaviors> 
     <endpointBehaviors> 

     </endpointBehaviors> 
    </behaviors> 
    </system.serviceModel> 

<startup><supportedRuntime version="v2.0.50727"/></startup></configuration> 
+0

ваши конфигурации Определенно endpoind являются правильными. Я немного смущен с «Entities.CmsDataService». Абсолютно неясно, откуда это название. Должно быть что-то вроде «CRMDataRetrieval.CRMDataService».
И мне не нравится имя класса DataContext. Он должен быть сгенерирован классом, но возможны конфликты именования с другими пространствами имен .Net, такими как System.Data.Linq – paramosh

+0

Объекты - это папка, которая содержит все классы, созданные crmsvcutil, которые я включаю в свой проект с помощью оператора using. CmsDataServices является одним из тех автоматически генерируемых классов. Как вы предлагаете мне работать без DataConext? Я рад попробовать. Можете ли вы предоставить подробную информацию? Спасибо за ваш вклад. –

+0

Быстрое примечание. Если есть класс сгенерированный автоматически DataContext, как мне его включить и использовать? Пожалуйста, предоставьте шаги –

ответ

0

Посмотрите на crmsvcutil parameters. Есть/dataContextPrefix и/dataContextClassName. Используйте эти параметры, чтобы установить собственное имя для сгенерированного контекста данных. Используйте созданный контекст, как это описано here

CrmConnection crmc = CrmConnection.Parse("Authentication Type=Passport; Server=https://" + org + ".crm.dynamics.com/" + org + "; User ID=myuser; Password=mypassword; Device ID=mydeviceid; Device Password=mydevicepassword"); 
var yourDataContext = new GeneratedDataContext(crmc); 

К сожалению, у меня нет CRM 4.0 установлен. Но я могу предоставить код для CRM 2011:

namespace CRMDataRetrieval 
{ 
    public class CRMDataService : ICRMData 
    { 
     public string getValue() 
     { 
      var connection = CrmConnection.Parse("Url=https://orgname.crm.dynamics.com; Username=OpenId; Password=; DeviceID=####; DevicePassword=####"); 
      var service = new OrganizationService(connection); 
      MyServiceContext context = new MyServiceContext(service); 

      string name = null; 
      var query = from n in context.ContactSet 
         where n.ContactId == new Guid("00000000-0000-0000-0000-000000000000") 
         select n.FullName; 
      foreach (var result in query) 
       name = result; 

      return name; 
     } 
    } 
} 

Я использовал конфигурацию конечной точки, которую вы предоставили.

Для создания классов я использовал

crmsvcutil.exe /url:https://orgname.crm.dynamics.com/XRMServices/2011/Organization.svc /out:GeneratedCode.cs /n:MyCrmNamespace /u:"OpenId" /p:"####" /serviceContextName:MyServiceContext /di:#### /dp:#### 
+0

, это сработало для меня. Единственное изменение, которое я сделал, это удалить cmsdatacontextclass, который был автоматически genereated и не использовать и указать servicecontext при использовании crmsvcutil, оставив класс datacontext, который я создал выше. Спасибо за вашу помощь. –

0

Можете ли вы рассказать о мировой точке мира и использовать ее? После этого вы можете использовать рабочий код, который вы уже написали. (если crmsvcutil не генерирует некоторые классы, предназначенные для размещения конечной точки wcf, о которой я не знаю?)

Я согласен с paramosh - «Entities.CmsDataService» - это не имя службы, которую я ожидал бы с учетом вашего примера , Я бы ожидал «CRMDataRetrieval.CRMDataService»