К сожалению очень мало толковой информации о том, как создать WCF веб-сервис для SharePoint, который будет доступен как для WS-* клиентов, так и для Javascript.

Да-да, я знаю что уже вышел SharePoint 2013 и .NET 4.5, то что WCF уже не модно, и надо юзать WebAPI и REST. НО не факт что можно будет расширять API для SharePoint 2013, а WebAPI в SharePoint 2013 не работает (или по крайней мере это еще никто не сделал).

Так что пока используем WCF, благо его возможностей более чем достаточно для решения задачи.

Для начала надо поставить расширение студии CKS Dev (правильно говорить “секасдев”, @amarkeev гарантирует это), в нем есть шаблон для WCF сервиса

image

Этот пункт создает веб-сервис с BasicHttpBinding.

В SharePoint не обязательно параметры указывать в web.config, достаточно указать Factory в .svc файле, что и делает данный шаблон.

Какие есть Factory и зачем они нужны можно узнать по ссылке.

В принципе можно и этот сервис использовать в javascript коде, но придется долго и мучительно генерировать и парсить XML для SOAP. Чего делать крайне не хочется.

Для того, чтобы работать с теплым ламповым JSON достаточно сделать несколько изменений.

  1. Скопировать .svc файл и поставить ему те же параметры развертывания, что у исходного сервиса. Я даю сервисам имя <servicename>.json.svc
  2. В новом файле .svc зменить MultipleBaseAddressBasicHttpBindingServiceHostFactory на MultipleBaseAddressWebServiceHostFactory
  3. В интерфейсе сервиса добавить атрибуты методам, например
    [ServiceContract]
    public interface ITestService
    {
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare, 
                RequestFormat = WebMessageFormat.Json, 
                ResponseFormat = WebMessageFormat.Json)]
        //[WebInvoke(Method="POST",
        //        BodyStyle = WebMessageBodyStyle.Bare,
        //        RequestFormat = WebMessageFormat.Json,
        //        ResponseFormat = WebMessageFormat.Json)]
        string HelloWorld();
    }

И все, код сервиса править не надо. Атрибуты WebGet и WebInvoke можно найти в сборке System.SeviceModel.Web.

Код для вызова сервиса (javascript):

var webServerRelativeUrl = _spPageContextInfo.webServerRelativeUrl != "/" 
                           ? _spPageContextInfo.webServerRelativeUrl 
                           : "";

$.ajax({
    type:"GET",
    url: webServerRelativeUrl + "/_vti_bin/testservice.json.svc/HelloWorld",
    dataType: 'json',
    success: function (data) {
        //success
    },
    error: function (error) {
        //error
    }
});

Если вам понадобится изменить параметры WCF сервиса, такие как максимальный объем сообщения, то это можно сделать с помощью класса SPWcfServiceSettings

public override void FeatureInstalled(SPFeatureReceiverProperties properties)
 {
     SPWebService contentService = SPWebService.ContentService;
     SPWcfServiceSettings wcfServiceSettings = new SPWcfServiceSettings();
     wcfServiceSettings.ReaderQuotasMaxStringContentLength = Int32.MaxValue;
     wcfServiceSettings.ReaderQuotasMaxArrayLength = Int32.MaxValue;
     wcfServiceSettings.ReaderQuotasMaxBytesPerRead = Int32.MaxValue;
     wcfServiceSettings.MaxReceivedMessageSize = Int32.MaxValue;            
     
     contentService.WcfServiceSettings["servicename.svc"] = wcfServiceSettings;

     contentService.Update(true);
 }

Если же вам понадобятся более глубокие возможности WCF, то можете создать свою ServiceHostFactory, отнаследовавшись от одной из тех, что предоставляет SharePoint.

Теги : javascript, WCF, SharePoint