Модель SharePoint BDC и WCF - PullRequest
1 голос
/ 07 июня 2011

Вот мой сценарий ..

Я создал проект модели BDC в VS2010 для развертывания в SharePoint2010. Я добавил ссылку на службу в службу WCF, которую мы используем в другой системе. Я хочу, чтобы мой метод ReadList вызывал службу WCF в другой системе для извлечения данных, которые будут показаны в списке.

Я создал модульный тест для метода ReadList, чтобы убедиться, что он работает перед развертыванием. Я получаю сообщение об ошибке: «Не удалось найти элемент конечной точки по умолчанию, который ссылается на контракт« TicketsWCF.ITickets »в разделе конфигурации клиента ServiceModel.»

Когда я добавляю ссылку на службу, в проект добавляется файл app.config, в котором, похоже, есть все, что мне нужно для запуска службы.

Мои два вопроса

  1. Кто-нибудь получал службу WCF для внешней системы без общего ресурса, работающей с BDC

  2. Когда модель развернута, будут ли параметры app.config надлежащим образом размещены в системе sharepoint?

Ответы [ 2 ]

0 голосов
/ 10 октября 2013

Я использовал WCF, работающий с BDC, во многих проектах. То, что я обычно делаю, описано ниже.

1) Создайте отдельное решение SharePoint под названием SPCommon

2) Добавить ссылку на сервис

3) Создать MyAppSettings.cs

 public class MyAppSettings
 {
    public string MyServiceEndPoint
    {
       get;
       set;
    }
 }

4) Создать ConfigurationManager.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SharePoint;
using System.Configuration;
using System.Web.Configuration;
using Microsoft.SharePoint.Administration;

namespace MyApp
{
   public class ConfigurationManager
    {       
       SPSite site;

       public ConfigurationManager(SPSite site)
       {
           this.site = site;        
       }

       public MyAppSettings GetAppSettings()
       {
           try
           {
               System.Configuration.Configuration config = WebConfigurationManager.OpenWebConfiguration("/", site.WebApplication.Name);
               AppSettingsSection appSettingSection = config.AppSettings;

               MyAppSettings settings = new MyAppSettings();
               settings.MyServiceEndPoint = appSettingSection.Settings["MyServiceEndPoint"].Value;

               return settings;
           }
           catch (Exception ex)
           {
               // Log Error              
           }
           return null;
       }
    }
}

5) Создайте файл MyServiceConnection.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MyServiceReference;
using System.ServiceModel;
using Microsoft.SharePoint;

namespace MyApp
{
    public class MyServiceConnection
    {
        public const int _maxBufferSize = 2147483647;
        public const int _maxReceivedBufferSize = 2147483647;
        public const int _maxStringContentLength = 2147483647;
        public const int _maxArrayLength = 2147483647;
        public const int _maxBytesPerRead = 2147483647;
        public const int _maxNameTableCharCount = 2147483647;
        public const int _maxDepth = 2147483647;   

        public static MyServiceProxyClient GetMyServiceProxyClient()
        {
            SPSite site = SPContext.Current.Site;

            // Get the EndPointUrl from Web.config appsetting
            ConfigurationManager configMgr = new ConfigurationManager(site);
            var appSetting = configMgr.GetAppSettings();

            EndpointAddress myServicecrmEndPoint;

            if (appSetting != null)
            {
                myServiceEndPoint = new EndpointAddress(appSetting.MyServiceEndPoint);

                var proxy = new MyServiceProxyClient(
                    new BasicHttpBinding(BasicHttpSecurityMode.TransportCredentialOnly)
                    {
                        MaxBufferSize = _maxBufferSize,
                        MaxReceivedMessageSize = _maxReceivedBufferSize,
                        ReaderQuotas = new System.Xml.XmlDictionaryReaderQuotas()
                        {
                            MaxStringContentLength = _maxStringContentLength,
                            MaxArrayLength = _maxArrayLength,
                            MaxBytesPerRead = _maxBytesPerRead,
                            MaxNameTableCharCount = _maxNameTableCharCount,
                            MaxDepth = _maxDepth
                        },
                    },
                    myServiceEndPoint
                );
                return proxy;
            }
            else
            {
                // Log Error

                return null;
            }            
        }      
    }
}

6) В решении для внешнего списка добавьте ссылку на проект SPCommon

7) Вызовите метод сервиса ReadMyList (), как показано ниже

MyServiceProxyClient service = SPCommon.GetMyServiceProxyClient();
listData = service.ReadMyList();

8) Добавить настройку приложения в Web.config

  <appSettings>
    <add key="MyServiceEndPoint" value="http://localhost:8101/MyService.svc" />
  </appSettings>

9) Обязательно разверните решения SPCommon и External List.

0 голосов
/ 05 октября 2013

К сожалению, я не нашел способа использовать файл конфигурации приложения в этом случае. Одним из способов решения этой проблемы является определение конечной точки в коде и, возможно, сохранение адреса конечной точки в пакете свойств фермы. Обратите внимание, что вам нужно будет добавить ссылку на System.ServiceModel.

    private static string endpointUri = SPContext.Current.Site.WebApplication.Farm.Properties["Service_Uri_PropertyBag_Key"] as string;
    private static EndpointAddress endpoint = new EndpointAddress(endpointUri);
    private static BasicHttpBinding binding = new BasicHttpBinding();

Тогда вызовы в службу WCF будут выглядеть примерно так:

        using (ReferencedServiceClient client = new ReferencedServiceClient(binding, endpoint))
        {
            return client.ReadList();
        }
...