26.09.2017

TFS XAML сборка C# 7

Входные данные:

- старый TFS с настроенными XAML-определениями сборок
- проект с использованием C# 7

Задача:

- заставить TFS билдить проект

Решение.

1. Установить на TFS-сервер Visual Studio Build Tools 2017

2. Отредактировать XAML-определение сборки (файл DefaultTemplate.12.0.xaml или другой), добавив внутрь элемента (элементов) mtbwa:MSBuild свойство ToolPath с указанием пути к новой версии MSBuild. Выглядеть это должно примерно так:
<mtbwa:MSBuild CommandLineArguments="[String.Format(&quot;/p:SkipInvalidConfigurations=true {0}&quot;, MSBuildArguments)]" Configuration="[platformConfiguration.Configuration]" DisplayName="Run MSBuild for Project" GenerateVSPropsFile="[True]" sap2010:WorkflowViewState.IdRef="MSBuild_1" MaxProcesses="[If (MSBuildMultiProc, 0, 1)]" OutDir="[BinariesDirectory]" Platform="[platformConfiguration.Platform]" Project="[localBuildProjectItem]" mva:VisualBasic.Settings="Assembly references and imported namespaces serialized as XML namespaces" Targets="[New String() { &quot;Clean&quot; }]" TargetsNotLogged="[New String() {&quot;GetNativeManifest&quot;, &quot;GetCopyToOutputDirectoryItems&quot;, &quot;GetTargetPath&quot;}]" ToolPath="c:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin\" ToolPlatform="[MSBuildPlatform]" Verbosity="[Verbosity]" />

3. По мере надобности или при возникновении соответствующей ошибки поправить в солюшне файл msbuild.xml, указав правильный путь к библиотеке Microsoft.Web.Publishing.Tasks.dll:

<UsingTask TaskName="TransformXml" AssemblyFile="c:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\Web\Microsoft.Web.Publishing.Tasks.dll" />

01.07.2015

Как включить трассировку запросов к базе для LLBLGen Pro

Для того, чтобы в режиме отладки посмотреть, какие запросы к базе генерирует ORM LLBLGen Pro, достаточно в web.config добавить несколько строк.
Например, для баз данных PostgreSQL:
<system.diagnostics>
    <switches>
        <add name="PostgreSqlDQE" value="4" />
    </switches>
</system.diagnostics>
Секция <system.diagnostics> должна находится в корневой секции <configuration>.

Свитчи для остальных баз данных и другие дополнительные сведения можно получить здесь.

30.06.2015

Как установить ETag из кода

Для того, чтобы вручную прикреплять к ответу сервера заголовки ETag и Last Modified, например в каком-нибудь HttpHandler, достаточно добавить лишь несколько строк кода:

context.Response.AddFileDependency(request.PhysicalPath);
context.Response.Cache.SetLastModifiedFromFileDependencies();
context.Response.Cache.SetCacheability(HttpCacheability.Public);
context.Response.Cache.SetETagFromFileDependencies();

где context — это HttpContext (или HttpContext.Current), а request — это HttpContext.Request (или HttpContext.Current.Request).

Решение было найдено здесь.

Если вдруг появится проблема с генерацией ETag, например возникнет HttpException: Unable to generate etag from dependencies. One of the dependencies couldn't generate a unique id, перед добавлением заголовков добавьте Thread.Sleep(10). Из-за чего возникает такое исключение, точно не известно. Решение было найдено здесь.

18.06.2014

Литература по ASP.NET MVC, DI, JQuery, HTML5

smarly.net — хорошая онлайн-библиотека для Web-разработчика на русском языке.

Включает книги по следующим технологиям:
- ASP.NET
- ASP.NET MVC
- Dependency Injection
- JQuery
- HTML5

На момент написания поста ресурс находился в стадии Beta.

20.09.2013

JS. Как закодировать символы для адресной строки

encodeURIComponent()

Для того, чтобы закодировать параметр, который вы хотите передать в адресной строке используйте функцию:

param1 = encodeURIComponent("http://xyz.com/?a=12&b=55")

Затем вы можете создать URL наподобие такого:

url = "http://domain.com/?param1=" + param1 + "&param2=99";

Результат:

http://www.domain.com/?param1=http%3A%2F%2Fxyz.com%2F%Ffa%3D12%26b%3D55&param2=99

11.09.2013

Кроссдоменные запросы при помощи easyXDM

Существует отличный плагин easyXDM, который, используя наиболее подходящий транспорт, манипулирует запросами между разными доменами или поддоменами.

Документация:
http://easyxdm.net - официальный сайт плагина
http://habrahabr.ru/post/120336/ - статья на Хабре
https://github.com/oyvindkinsey/easyXDM - директория на GitHub
Этого мне хватило, чтобы разобраться, как без особых проблем отправлять POST-запросы на API, находящийся на поддомене.

Тест кроссбраузерной авторизации
<form id="myForm" method="POST">
    <div>
        <input type="text" id="name" name="Name" class="k-textbox" />
    </div>
    <div>
        <input type="text" id="password" name="Password" class="k-textbox" />
    </div>
    <input type="submit" value="Отправить" class="k-button" />
</form>
<script>
   
    $('#myForm').ajaxForm({
        beforeSubmit: function (arr, form, options) {
            //if (options.url.indexOf(location.host) < 0) { // если хост удаленный то используем наш метод
            var json = {};
            for (var i = 0; i < arr.length; i++) { // преобразуем сериализованные данные формы в нормальный объект js готовый к нашей сериализации (сама форма их передает в весьма странном виде)
                json[arr[i].name] = btoa(arr[i].value);
            }
            rpc.request({
                    // шлем кросс доменный запрос, подставляя наши параметры
                    url: apiRoute + "auth",
                    method: "POST",
                    data: json,
                    headers: {
                        'RequestVerificationToken': token
                    }
                }, function (response) {
                    alert('Success');
                }, function (response) {
                    alert('Error\n' + response.message);
                    return false;
                });
            return false; //останавливаем нативный ajax запрос от jQ
            //}
            //return false;
        }
    });

    var rpc = new easyXDM.Rpc({
            remote: apiRoute + "Scripts/EasyXDM"
        },
        {
            local: {
                request: {}
            },
            remote: {
                request: {}
            }
        });
</script>

28.08.2013

Если IE < 10 не хочет отправлять кроссдоменные запросы

Ситуация возникла после того, как проект был задеплоен на сервер. Прикол в том, что на IIS Express 8 и на IIS 7.5, установленные на локальной машине, все успешно работало. Запросы к API, размещенному на другом домене шли без проблем. Однако после выкладки на сервер IE 9 просто не слал ajax-запросы.

Проблему решил небольшой js, который посчастливилось найти на просторах интернета.
https://github.com/Malvolio/ie.xhr

Но стоит учесть, что он преобразует запрос в формат XDomainRequest, который в свою очередь имеет кучу ограничений. Например, нельзя присоединить к реквесту собственный хидер. Весь перечень ограничений легко можно найти в интернете — изучая материал, сто раз на него натыкался.