четверг, 10 апреля 2014 г.

Как бороться с ошибкой "шаблон формы опубликован на сервере, но для его открытия нужен Infopath Filler"

Если при редактировании InfoPath формы, привязанной к рабочему процессу на SharePoint, во время сохранения уже отредактированной формы на сервере, она у вас не будет сохраняться с этой ошибкой (англоязычный вариант: "An unknown error has occurred. The form template has been published to the server but it can only be opened in infopath filler"), то не спешите паниковать. Хотя решение и не очевидное - но оно есть.
В интернете, если поискать по английской версии ошибки, находится куча всяких советов, большинство которых, увы не работает (по крайней мере, у меня не заработало). Помогло только добавление компонента "Desktop Experience" (в русскоязычном варианте - "Возможности рабочего стола"). Добавляется она так:

в англоязычной версии:
Server Manager > Features > Add Features  > Desktop Experience.

в русскоязычной версии:
Диспетчер сервера > Компоненты > Добавить компоненты > Возможности рабочего стола 


вторник, 8 апреля 2014 г.

Про ошибки в русскоязычной версии MS SQL

Сегодня столкнулся с одной ошибкой на русскоязычной версии MS SQL, вначале долго смеялся, потом долго тупил. Выглядела эта ошибка вот так:

Потом попробовал перевести текст ошибки обратно на английский и сразу стало все понятно.

Transaction (Process ID 57) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

Вот интересно, кто делает эти переводы и с какой целью? По-моему, даже если не знать английский совсем, то такой перевод не сделает сообщение об ошибке более понятным...

PS. Да, на всякий случай, если кто не знал: жертва дедлока (то есть, процессом, принудительно убиваемым). Вначале проверяется приоритет транзакций (если не установлен специально, с помощью SET DEADLOCK_PRIORITY , то у всех транзакций приоритет одинаковый - NORMAL или 0) и убивается транзакция с меньшим приоритетом. Если приоритет одинаковый, то жертвой выбирается транзакция, которую быстрее откатить (то есть, сделать ROLLBACK). Если же и затраты на ROLLBACK у транзакций, попавших в дедлок одинаковы, то жертва выбирается случайным образом.


Как установить стартовой страницу на другом узле.

Допустим, что у вас русская версия сайта и английская находятся на разных узлах, то есть в корне живет русскоязычный сайт, а на сайте /en/ его англоязычная копия. И вдруг вы захотели сделать стартовой страницей страницу англоязычных новостей, то есть /en/Pages/news.aspx. Стандартными средствами (SharePoint Designer, PowerShell) вы это сделать не сможете, из-за того, что страница не является частью сайта для которого вы хотите сделать ее главной. Как быть?
Тут нам на помощь приходит знание того, что сайт SharePoint - это, по сути, обычный ASP.NET сайт. И соответственно, мы можем делать с шарепоинтным конфигом то же самое что и с любым кофигом сайта на ASP.NET. Так что, чтобы сделать совершенно любую страницу стартовой вам достаточно добавить в секцию <system.web> вот такой элемент:

<urlMappings enabled="true">
  <clear />
  <add url="~/" mappedUrl="~/en/Pages/news.aspx" />
</urlMappings>


воскресенье, 6 апреля 2014 г.

Вызов методов web-сервисов/серверных методов с помощью jQuery

В старые добрые времена, если вы хотели обратиться из клиентского кода к веб-сервису, или, что серверному методу [WebMethod], то приходилось писать много кода использующего javascript-объект XMLHttpRequest. Сейчас же, если вы используете в своем ASP.NET проекте jQuery, сделать серверный запрос из клиентского кода очень просто. Допустим, у вас есть вот такой метод:

        [WebMethod]
        public static string GetSomeNewString(string _id, string _name)
        {
             string result;
             /..../
             return result;
        }

Все что вам нужно, чтобы вызвать его на клиенте это написать что-то типа:
        $.ajax({
            type: "POST",
            url: "~/Default.aspx/GetSomeNewString",
            data: "{'_id': '" + Id + "','_taskid': '' }",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            context: this,
            success: function (response) {
                //сюда мы попадаем в случае успешного выполнения серверной функции
                //результат выполнения будет в response.d
            },
            failure: function (response) {
                 //сюда мы попадаем в случае ошибки
                 alert(response.d);
            }
        });


Кстати, этот же способ можно использовать и для веб-частей SharePoint. Единственное отличие в том, что веб-часть не может содержать серверные методы (то есть, конечно, может, но смысла в этом мало - обращаться к вы можете только либо к веб-сервисам, либо к страницам с веб-методами).  Так что, все что вам нужно - это добавить в проект решения для SharePoint страницу приложения (Application Page) которая и будет содержать веб-методы: