【问题标题】:Web API vs Self HostedWeb API 与自托管
【发布时间】:2017-01-05 10:52:46
【问题描述】:

对不起,如果我的问题让任何人感到困惑,我正在努力使场景清晰。

我正在为调用 HttpClient 方法的方法编写测试用例。所以,我最终编写了以下测试方法。

[TestMethod]
    public async Task CallComplexRefTypeParamAPI_Get_GetResponseWithParamatersNameValueAppended()
    {

        #region Arrange
        //var resourceURL = @"http://localhost:32662/api/user/ComplexReferenceTypeParamStringResponse";
        var resourceURL = @"/api/user/ComplexReferenceTypeParamStringResponse";
        var restHelper = new RestHelper(_BaseAddress);

        string ParameterKey1 = "VariableStr";
        string ParameterValueStr = "Jia";

        string ParameterKey2 = "VariableInt";
        int ParameterValueInt = 1;

        string ParameterKey3 = "VariableBool";
        bool ParameterValueBool = true;

        string ParameterKey4 = "VariableDateTime";
        DateTime ParameterValueDateTime = DateTime.Now;

        ComplexRefType ParameterComplexRefType = new ComplexRefType()
        {
            VariableBool = ParameterValueBool,
            VariableDateTime = ParameterValueDateTime,
            VariableInt = ParameterValueInt,
            VariableStr = ParameterValueStr
        };
        string result;
        #endregion

        #region Act
        using (WebApp.Start<WebApiStartup>(_BaseAddress))
        {
            restHelper.AddURLParameters("VariableComplexRef", ParameterComplexRefType);
            restHelper.AddURLParameters("DummyStr", "DummyStr");
            result = await restHelper.ExecuteAsync<string>(HttpMethod.Get, resourceURL);
        }
        #endregion

        #region Assert
        Assert.AreEqual<string>(string.Format("{0}={1}&{2}={3}&{4}={5}&{6}={7}",
                                    ParameterKey1, ParameterValueStr,
                                    ParameterKey2, ParameterValueInt,
                                    ParameterKey3, ParameterValueBool,
                                    ParameterKey4, ParameterValueDateTime), result);
        #endregion

    }

另一方面,我的测试控制器有以下两种方法。

       public string GetMultipleTypeParamStringResponse(string VariableStr, int VariableInt, DateTime VariableDateTime)
    {
        return string.Format("VariableStr={0}&VariableInt={1}&VariableDateTime={2}", VariableStr, VariableInt, VariableDateTime);
    }


    public string GetComplexReferenceTypeParamStringResponse([FromUri]ComplexRefType VariableComplexRef, string DummyStr)
    {
        return string.Format("VariableStr={0}&VariableInt={1}&VariableBool={2}&VariableDateTime={3}",
                                VariableComplexRef.VariableStr,
                                VariableComplexRef.VariableInt,
                                VariableComplexRef.VariableBool,
                                VariableComplexRef.VariableDateTime);
    }

我在 Web API 应用程序中复制了相同的控制器。如果运行指向自托管 API 的测试方法,应用程序会点击“GetMultipleTypeParamStringResponse”而不是“GetComplexReferenceTypeParamStringResponse”。但是,如果我针对 Web API 运行它,它会命中正确的“GetComplexReferenceTypeParamStringResponse”方法。

有人可以帮我理解为什么会出现这种行为吗?在这两种情况下,生成的查询字符串看起来都很相似。

自托管 http://localhost:8888/api/user/ComplexReferenceTypeParamStringResponse?VariableStr=Jia&VariableInt=1&VariableBool=True&VariableDateTime=1%2F5%2F2017 3:49:10 PM&DummyStr=DummyStr

网络 API http://localhost:32662/api/user/ComplexReferenceTypeParamStringResponse?VariableStr=Jia&VariableInt=1&VariableBool=True&VariableDateTime=1%2F5%2F2017 3:50:58 PM&DummyStr=DummyStr

【问题讨论】:

  • 您可以尝试将显式 [Route("api/user/ComplexReferenceTypeParamStringResponse")] 属性添加到您的测试控制器方法中。
  • 试过了,但这并没有太大帮助。它仍然以相同的方式运行
  • 您能否也发布您在测试 api 应用程序中的路由配置?
  • ' public void Configuration(IAppBuilder appBuilder) { // 为自托管配置 Web API。 HttpConfiguration 配置 = 新的 HttpConfiguration(); config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); appBuilder.UseWebApi(config); }'
  • 您可以尝试更改路由配置中的 routeTemplate: "api/{controller}/{action}/{id}" 并包含上一条评论中提到的 Route 属性(同时标记使用 [HttpGet] 显式方法

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


【解决方案1】:

将路由配置中的路由模板更改为

routeTemplate: "api/{controller}/{action}/{id}" 

使用显式 Route 属性和 HttpGet 动词标记方法,如下所示

[HttpGet]
[Route("api/user/ComplexReferenceTypeParamStringResponse")] 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-24
    • 2015-01-09
    • 2017-11-17
    • 1970-01-01
    相关资源
    最近更新 更多