所以我有一个这种结构的API:
[RoutePrefix("api/AppMananciais")]
public class AppMananciaisController : ApiController
{
// GET api/<controller>
[AcceptVerbs("Get")]
[Route("DadoDia/{_data}")]
public object DadoDia(DateTime _data)
{
/*some code*/
}
我曾经这样打电话? http://myurl.com/api/AppMananciais/DadoDia/2018-01-01
然后我们为它开发了一个更新,并包含了API版本的可选参数
// GET api/<controller>
[AcceptVerbs("Get")]
[Route("DadoDia/{_data}/{api_version?}")]
public object DadoDia(DateTime _data, int api_version = 1)
{
/*some code*/
}
所以这两个调用都应该有效:
http://myurl.com/api/AppMananciais/DadoDia/2018-01-01 http://myurl.com/api/AppMananciais/DadoDia/2018-01-01/2
我们在Visual Studio上本地测试,然后在开发服务器,测试服务器和验收测试服务器上发布,在所有这些服务器上按预期工作。
当我们最终发布到生产服务器时,它没有按预期工作。调用API的旧方法工作正常
http://myurl.com/api/AppMananciais/DadoDia/2018-01-01
从结果我们可以看出它确实正在运行更新版本。
但调用API的新方法返回错误404 http://myurl.com/api/AppMananciais/DadoDia/2018-01-01/2
所有服务器都运行相同版本的IIS(8.5.9600.16384)
他们的Web.config是相同的,除了指示在哪里获取数据的键/值对。测试表明数据源工作正常,并使用api version参数了解新语法。
<configuration>
<system.web>
<compilation targetFramework="4.6" />
<httpRuntime targetFramework="4.6" />
</system.web>
<system.webServer>
<handlers>
<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" />
</handlers>
</system.webServer>
<appSettings>
<add key="apiIntranet" value="http://datasource:1059/" />
</appSettings>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
</configuration>
经过一番研究后,我尝试在Web.config中包含以下行,但没有解决问题:
<modules runAllManagedModulesForAllRequests="true" />
为了使API按预期工作并在其测试的每个其他服务器中验证,我应该寻找其他什么提示?