Модуль DNN 6 - Как использовать асинхронные вызовы - PullRequest
4 голосов
/ 28 декабря 2011

DotNetNuke 6 не поддерживает WebMethods из-за того, что модули разрабатываются как пользовательские элементы управления, а не как страницы aspx.

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

Ответы [ 2 ]

4 голосов
/ 29 декабря 2011

Похоже, лучший способ справиться с этой проблемой - пользовательские Httphandlers. Я использовал пример, найденный в Статья Криса Хаммондса для базовой линии.

Общая идея заключается в том, что вам нужно создать собственный обработчик HTTP:

<system.webServer>
  <handlers>
    <add name="DnnWebServicesGetHandler" verb="*" path="svc/*" type="Your.Namespace.Handler, YourAssembly" preCondition="integratedMode" />
  </handlers>
</system.webServer>

Вам также нужна устаревшая конфигурация обработчика:

<system.web>
  <httpHandlers>
    <add verb="*" path="svc/*" type="Your.Namespace.Handler, YourAssembly" />
  </httpHandlers>
</system.web>

Сам обработчик очень прост. Вы используете URL-адрес запроса и параметры для определения необходимой логики. В этом случае я использовал Json.Net для возврата данных JSON клиенту.

public class Handler: IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        //because we're coming into a URL that isn't being handled by DNN we need to figure out the PortalId
        SetPortalId(context.Request);
        HttpResponse response = context.Response;
        response.ContentType = "application/json";

        string localPath = context.Request.Url.LocalPath;
        if (localPath.Contains("/svc/time"))
        {
            response.Write(JsonConvert.SerializeObject(DateTime.Now));
        }

    }

    public bool IsReusable
    {
        get { return true; }
    }

    ///<summary>
    /// Set the portalid, taking the current request and locating which portal is being called based on this request.
    /// </summary>
    /// <param name="request">request</param>
    private void SetPortalId(HttpRequest request)
    {

        string domainName = DotNetNuke.Common.Globals.GetDomainName(request, true);

        string portalAlias = domainName.Substring(0, domainName.IndexOf("/svc"));
        PortalAliasInfo pai = PortalSettings.GetPortalAliasInfo(portalAlias);
        if (pai != null)
        {
            PortalId = pai.PortalID;
        }
    }

    protected int PortalId { get; set; }
}

Вызов http://mydnnsite/svc/time обработан правильно и возвращает JSON, содержащий текущее время.

0 голосов
/ 03 марта 2015

У кого-нибудь еще есть проблема доступа к состоянию сеанса / обновления информации о пользователе через этот модуль?Я получил запрос / ответ на работу, и я могу получить доступ к интерфейсу DNN, однако, когда я пытаюсь получить текущего пользователя, он возвращает ноль;что делает невозможным проверку ролей доступа.

//Always returns an element with null parameters; not giving current user
var currentUser = UserController.Instance.GetCurrentUserInfo();
...