在IIS 7.5 - 404找不到的HttpClient调用WebApi服务

时间:2014-01-24 08:05:58

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

我是WebApi的新手,我们需要创建\维护令牌发布Web服务。我的一位同事提供了他允许我使用的解决方案(测试版)。如果我从我的开发环境(VS 2012)运行Web服务,我可以查询它并从Web浏览器(Chrome)获取令牌。然后我写了一个测试应用程序,使用HttpClient查询服务并获取令牌。这可以在我的开发环境中托管的服务中正常工作,但如果我在使用我的小测试应用程序在IIS中托管时尝试查询它,我会得到'404 Not Found'异常。但让我感到困惑的是,如果我从Chrome连接到IIS托管的Web服务,它可以工作吗?

我的控制器方法如下:

[HttpGet]
public IHttpActionResult GetToken(string username, string password, string realm)
{            
    return Json("TOKEN-STRING");
}

我的配置:

<system.webServer>
<validation validateIntegratedModeConfiguration="false" />    
<modules runAllManagedModulesForAllRequests="true">
  <remove name="UrlRoutingModule-4.0" />
  <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="" />
</modules>
<handlers>
  <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
  <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
  <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
  <remove name="OPTIONSVerbHandler" />
  <remove name="TRACEVerbHandler" />
  <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
  <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,PUT,DELETE,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
  <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,PUT,DELETE,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
</handlers>

我已将我的应用程序池设置为IIS中的“集成”。

我的逻辑告诉我,如果我能够从Chrome中检索令牌而不是从我的应用程序中检索令牌,那么IIS应该没有任何问题,而是我的应用程序中的config \ setting \ programming错误。

这是我写的获取令牌的小方法:

async private void GetToken()
    {
        HttpClient client = new HttpClient();

        client.BaseAddress = new Uri("http://localhost/TokenServer/");
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        var response = client.GetAsync("/api/TokenServer/GetToken/name/password/realm").Result;
        string result =  await response.Content.ReadAsStringAsync();

        if (!response.IsSuccessStatusCode)
        {
            //Error handling
            return;
        }

        //Extract token from response
        JavaScriptSerializer json_serializer = new JavaScriptSerializer();
        Token = DeserializeJsonToken(result);
    }

我已阅读并尝试了许多建议,但似乎没有一项对我有用。我现在已经坚持了两天,截止日期正在蔓延:)

的Tx

1 个答案:

答案 0 :(得分:2)

此处的问题在于您有一个前导/的Url,导致不考虑baseaddress Url的TokenServer部分。因此,请按以下方式修改呼叫:

client.GetAsync("api/TokenServer/GetToken/name/password/realm").Result;

小贴士:像Fiddler这样的工具在这些情况下非常有用。它有助于诊断发送到服务的原始请求。