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



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

我的控制器方法如下:

[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.NETFramework64v4.0.30319aspnet_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.NETFrameworkv4.0.30319aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
</handlers>

我在 IIS 中将应用程序池设置为"集成"。

我的逻辑告诉我,如果我能够从Chrome中检索令牌,但不能从我的应用程序中检索令牌,那么IIS应该没有问题,而是我的应用程序中的配置\设置\编程错误。

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

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);
}

我已经阅读并尝试了许多建议,但似乎都不适合我。我已经坚持了两天了,截止日期越来越:)

德克萨斯

这里的问题在于 Url,其中您有一个前导/,这会导致不考虑基址 URL 的TokenServer部分。因此,请按如下方式修改调用:

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

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

最新更新