Разверните мой DLLs на GAC для использования с Приложением ClickOnce

Вы пробовали DevDefined.OAuth?

Я использовал его, чтобы защитить свой WebApi с помощью 2-Legged OAuth. Я также успешно протестировал его с PHP-клиентами.

С помощью этой библиотеки довольно легко добавить поддержку OAuth. Вот как вы можете реализовать провайдер для ASP.NET MVC Web API:

1) Получить исходный код DevDefined.OAuth: https://github.com/bittercoder/DevDefined.OAuth - новейшая версия обеспечивает расширяемость OAuthContextBuilder.

2) Создайте библиотеку и сделайте ссылку на нее в своем проекте Web API.

3) Создайте пользовательский конструктор контекста для поддержки построения контекста из HttpRequestMessage:

using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Net.Http;
using System.Web;

using DevDefined.OAuth.Framework;

public class WebApiOAuthContextBuilder : OAuthContextBuilder
{
    public WebApiOAuthContextBuilder()
        : base(UriAdjuster)
    {
    }

    public IOAuthContext FromHttpRequest(HttpRequestMessage request)
    {
        var context = new OAuthContext
            {
                RawUri = this.CleanUri(request.RequestUri), 
                Cookies = this.CollectCookies(request), 
                Headers = ExtractHeaders(request), 
                RequestMethod = request.Method.ToString(), 
                QueryParameters = request.GetQueryNameValuePairs()
                    .ToNameValueCollection(), 
            };

        if (request.Content != null)
        {
            var contentResult = request.Content.ReadAsByteArrayAsync();
            context.RawContent = contentResult.Result;

            try
            {
                // the following line can result in a NullReferenceException
                var contentType = 
                    request.Content.Headers.ContentType.MediaType;
                context.RawContentType = contentType;

                if (contentType.ToLower()
                    .Contains("application/x-www-form-urlencoded"))
                {
                    var stringContentResult = request.Content
                        .ReadAsStringAsync();
                    context.FormEncodedParameters = 
                        HttpUtility.ParseQueryString(stringContentResult.Result);
                }
            }
            catch (NullReferenceException)
            {
            }
        }

        this.ParseAuthorizationHeader(context.Headers, context);

        return context;
    }

    protected static NameValueCollection ExtractHeaders(
        HttpRequestMessage request)
    {
        var result = new NameValueCollection();

        foreach (var header in request.Headers)
        {
            var values = header.Value.ToArray();
            var value = string.Empty;

            if (values.Length > 0)
            {
                value = values[0];
            }

            result.Add(header.Key, value);
        }

        return result;
    }

    protected NameValueCollection CollectCookies(
        HttpRequestMessage request)
    {
        IEnumerable values;

        if (!request.Headers.TryGetValues("Set-Cookie", out values))
        {
            return new NameValueCollection();
        }

        var header = values.FirstOrDefault();

        return this.CollectCookiesFromHeaderString(header);
    }

    /// 
    /// Adjust the URI to match the RFC specification (no query string!!).
    /// 
    /// 
    /// The original URI. 
    /// 
    /// 
    /// The adjusted URI. 
    /// 
    private static Uri UriAdjuster(Uri uri)
    {
        return
            new Uri(
                string.Format(
                    "{0}://{1}{2}{3}", 
                    uri.Scheme, 
                    uri.Host, 
                    uri.IsDefaultPort ?
                        string.Empty :
                        string.Format(":{0}", uri.Port), 
                    uri.AbsolutePath));
    }
}

4) Используйте это руководство для создания поставщика OAuth: http://code.google .com / р / devdefined-инструменты / вики / OAuthProvider . На последнем шаге (Пример доступа к защищенным ресурсам) вы можете использовать этот код в своем атрибуте AuthorizationFilterAttribute:

public override void OnAuthorization(HttpActionContext actionContext)
{
    // the only change I made is use the custom context builder from step 3:
    OAuthContext context = 
        new WebApiOAuthContextBuilder().FromHttpRequest(actionContext.Request);

    try
    {
        provider.AccessProtectedResourceRequest(context);

        // do nothing here
    }
    catch (OAuthException authEx)
    {
        // the OAuthException's Report property is of the type "OAuthProblemReport", it's ToString()
        // implementation is overloaded to return a problem report string as per
        // the error reporting OAuth extension: http://wiki.oauth.net/ProblemReporting
        actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized)
            {
               RequestMessage = request, ReasonPhrase = authEx.Report.ToString()
            };
    }
}

Я реализовал свой собственный провайдер, поэтому я не тестировал приведенный выше код (за исключением, конечно, WebApiOAuthContextBuilder, который я использую в своем провайдере), но он должен работать нормально.

6
задан Nathan Baulch 9 September 2009 в 08:06
поделиться

6 ответов

Расширение ответа @kanad ...

Ваши 13 МБ DLL будут загружены пользователями только при первой установке приложения. Это одно из больших преимуществ ClickOnce, пользователям нужно загружать только те файлы, которые были изменены.

Однако сбивает с толку то, что диалоговое окно выполнения ClickOnce всегда показывает полный размер вашего приложения, даже если оно может загружать не все приложение. Я провел обширное тестирование, чтобы убедиться, что это так, и убедился в этом с помощью монитора полосы пропускания.

Наконец, если у вас есть контроль над своим веб-сервером, вы можете рассмотреть возможность включения сжатия для ваших приложений ClickOnce. Это помогает значительно уменьшить размер загрузки. Сжатие - это своего рода боль, чтобы настроить, но эта статья должна помочь вам начать работу. Однако, опять же, сжатый размер не отражается в диалоговом окне выполнения ClickOnce.

Лучше всего просто игнорировать число, которое отображается в диалоговом окне выполнения ClickOnce:)

7
ответ дан 8 December 2019 в 05:57
поделиться

Clickonce не может устанавливать файлы в GAC. Для этого вам потребуется создать MSI или повысить привилегии.

Как правило, вам следует избегать GAC, если он не решает конкретную проблему. Является ли размер установки более сложной задачей, чем загрузка ClickOnce - пользователи используют модемы 50K или высокоскоростную локальную сеть?

У Криса Селлса есть отличная статья о том, почему вам следует избегать GAC , и там есть различные другие сообщения о переполнении стека на нем - см. здесь , здесь и здесь .

В конце дня вам нужно оценить плюсы и минусы против и решите, что лучше всего сделать.

4
ответ дан 8 December 2019 в 05:57
поделиться

Хотя другие ответы верны, ClickOnce будет загружать библиотеки DLL только один раз (если они не изменились), чтобы ответить на ваш прямой вопрос, если вы будете устанавливать библиотеки DLL в GAC за пределами ClickOnce и не хотите загружать эти библиотеки DLL через ClickOnce, вы можете сделать следующее.

Исключить эти библиотеки DLL из загрузки ClickOnce, установив для них значение предварительное условие в настройках ClickOnce-> Application Files .

Когда вы это сделаете, среда выполнения ClickOnce проверит GAC перед загрузкой и убедится, что эти библиотеки DLL существуют.

3
ответ дан 8 December 2019 в 05:57
поделиться

Вот что я делал в прошлом, и это хорошо сработало для меня. У меня есть приложение ClickOnce, которое ищет некоторые из этих зависимостей в GAC. Фактически, он проверяет каждый раз при загрузке приложения. Я использую простой файл, чтобы увидеть, есть ли зависимости в GAC. Если зависимость отсутствует, я показываю сообщение о том, что вам не хватает какой-то зависимости и некоторые инструкции по ее устранению. Затем я выкладываю и загружаю самораспаковывающийся exe, который устанавливает зависимости в GAC. Это маленький Руби Голдберген, но он на удивление хорошо сработал для меня.

Я бы поместил в GAC только те вещи, которые будут статичными в обозримом будущем. Сторонние элементы управления и т. Д.

У меня есть довольно толстый клиент, который включает, среди прочего, MS Reporting, Infragistics и SMO, который мы развертываем в неделю это примерно 3,5 МБ.

4
ответ дан 8 December 2019 в 05:57
поделиться

Как узнать, загружаются ли каждый раз все 15 МБ. Диалоговое окно clickonce всегда говорит об этом, но фактически загружает не все файлы, а только те, чей хэш имеет изменения в манифесте. При этом существует способ развертывания с компакт-диска с другим URL-адресом для проверки обновлений. Таким образом, вы можете установить с компакт-диска в первый раз, и с этого момента приложение может обновляться только само с вашего опубликованного сайта.

2
ответ дан 8 December 2019 в 05:57
поделиться

Согласно Google и , здесь тоже нет.

Вам нужно будет изучить альтернативные инструменты установки, такие как создание установщика MSI. Это звучит странно, но моей первой идеей решить проблему размера установки было бы иметь два установщика . Один для установки зависимостей в GAC, который пользователям нужно запустить только один раз, а другой установщик (который, я думаю, мог бы использовать ClickOnce) для установки самого приложения. Используя этот метод, теоретически можно полагаться на меньшее развертывание ClickOnce для всех будущих обновлений приложений.

2
ответ дан 8 December 2019 в 05:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: