gpt4 book ai didi

c# - DNN 6 模块 - 如何利用异步调用

转载 作者:太空狗 更新时间:2023-10-30 01:24:43 24 4
gpt4 key购买 nike

DotNetNuke 6 似乎不支持 WebMethods,因为模块是作为用户控件而不是 aspx 页面开发的。

从 DNN 用户模块路由、调用 JSON 并将其返回到包含该模块的页面的推荐方法是什么?

最佳答案

看来处理此问题的最佳方法是自定义 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/time 的调用并返回包含当前时间的 JSON。

关于c# - DNN 6 模块 - 如何利用异步调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8657149/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com