2011-12-28 3 views
3

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

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

ответ

3

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

Основная идея заключается в том, что вам нужно создать пользовательский обработчик 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/время правильно обрабатывается и возвращает JSON, содержащий текущее время.

+5

Должен ли я получить точки StackOverflow для этого? ;) –

+0

@ Крис Хаммонд, вы получаете довольно большое спасибо, так как у вас достаточно очков, как есть. – tatigo

+0

хех в то время, когда у меня их было не так много: D –

0

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

//Always returns an element with null parameters; not giving current user 
var currentUser = UserController.Instance.GetCurrentUserInfo(); 
Смежные вопросы