【问题标题】:Web Api call using IHTTP Module使用 IHTTP 模块的 Web Api 调用
【发布时间】:2016-04-21 11:13:00
【问题描述】:

您好,我正在使用 HttpModule 来调用 WebAPI。 目前该解决方案在系统本地运行,但是一旦我在服务器中发布代码,它就无法进行 API 调用。这里是示例代码:

   public class AppModule: IHttpModule
{
     public void Init(HttpApplication httpApp)
    {
        httpApp.BeginRequest += OnBeginRequest;
        httpApp.EndRequest += OnEndRequest;
        httpApp.PreSendRequestHeaders += OnHeaderSent;
    }
      public void OnBeginRequest(Object sender, EventArgs e)
            {
                try
                {
                    var httpApp = (HttpApplication)sender;
                    if (httpApp.Request.Path.StartsWith("/media/")) return;
                    string a = httpApp.Request.ServerVariables["ID"];
                    if (String.IsNullOrEmpty(a))
                    {
                        a = System.Configuration.ConfigurationManager.AppSettings["ID"];
                    }
                    var absolutepath = httpApp.Request.Url.AbsolutePath;
                    var values = new Dictionary<string, object>
                    {
                        { "ID", a },
                        { "Browser",httpApp.Request.Browser["Type"] },
                        { "Url",httpApp.Request.Url.Scheme + "://" + httpApp.Request.Url.Authority + absolutepath},
                        { "OperatingSys",httpApp.Request.Headers["User-Agent"] },
                        { "IPAddss",httpApp.Request.UserHostAddress },
                        { "LDate",System.DateTime.Now.ToString() },
                    };

                        var serializer = new JavaScriptSerializer();
                        var appData = serializer.Deserialize<DataVO>(serializer.Serialize(values));
                        AppModuleVO objAppModuleVO = new AppModuleVO();
                        //AppModuleVo has all the properties.
                        objAppModuleVO.WebUrl = System.Configuration.ConfigurationManager.AppSettings["APIURL"] + MethodCall;
                        objAppModuleVO.objDataVo = appData;
                        ThreadPool.QueueUserWorkItem(new WaitCallback(HandlePostRequest), objAppModuleVO);

                }
                catch (Exception ex)
                {

                }
            }
}

我已经在 Web.Config 中注册为

<system.web>
    <httpModules>
        <add name="AppModule" type="Fighter.Modules.AppModule"/>
    </httpModules>
</system.web>
<system.webServer>
    <modules>
        <add name="AppModule" type="Fighter.Modules.AppModule"/>
    </modules>
</system.webServer>

我不确定在服务器中发布代码后是否需要在IIS服务器中进行任何更改或注册。注意:我也在服务器中部署了API并提供了正确的路径,因为其他方法可以调用被排除的同一个API。请帮助。问题似乎是由于 IIS 目前我在托管管道模式下使用 IIS 7.0 作为 CLASSIC。此问题的任何解决方法。

【问题讨论】:

  • 什么失败了?有一个问题。去那里了吗?
  • @Asken 当我在本地运行解决方案时它工作得很好,问题是在服务器中发布代码后出现的。
  • 需要更多数据...可以是任何数据。您必须查看 iis 日志。你也可以尝试让一个死的简单模块返回类似字符串的东西,看看它是否有效。如果有对外部站点的调用,您可能必须确保您有权这样做。如果您可以控制服务器,可以尝试设置&lt;trust level="Full" /&gt;
  • @lincolnk 你能帮忙吗
  • @Asken 问题似乎是因为 IIS 7.0 处于经典模式。有任何解决方法吗?

标签: c# asp.net asp.net-mvc iis asp.net-web-api


【解决方案1】:

渴望评论所以...在你的 web.config 中试试这个:

....
<system.webServer>
    <modules>
        <add name="AppModule" type="Fighter.Modules.AppModule"/>
    </modules>
    <validation validateIntegratedModeConfiguration="false" />
</system.webServer>

话虽如此,您应该考虑使用 IntegratedMode。

【讨论】:

  • 你确定它会在经典模式下工作吗,因为无法将服务器配置更改为集成,因为这部分项目可能会影响其他依赖项。
  • 没有什么是肯定的,但至少集成验证将被删除。另一种选择是使用集成创建一个新的应用程序池。如果您随后将其用于您的应用程序,它将不会干扰其他应用程序。它们将是完全独立的,可以相互停止、启动和回收。
猜你喜欢
  • 1970-01-01
  • 2016-11-17
  • 2020-07-15
  • 1970-01-01
  • 2015-05-05
  • 2015-11-13
  • 1970-01-01
  • 1970-01-01
  • 2012-08-23
相关资源
最近更新 更多