跟随字符串输入时,可选字符串输入不是可选的?

时间:2016-11-08 16:40:17

标签: asp.net-web-api asp.net-web-api2 swagger swagger-ui swashbuckle

我正在尝试将接口实现为服务控制器。我没有维护这个界面,所以我无法修改它。为简单起见,我们假设接口如下所示:

public interface IFoo
{
    string Bar(string A, int B);
}

对于我的控制器,让我们说它看起来像这样:

public class FooController : ApiController, IFoo
{
    [Route("~/Foo/Bar")]
    [HttpGet]
    public string Bar(string optionalA, int requiredB)
    {
        return DoStuff(optionalA, requiredB);
    }
}

使用此设置,如何在不更改A的情况下将B装饰为可选和IFoo而不更改RequiredAttribute(即无法重新排序A和B)并且仍然让我的控制器实现IFoo?默认情况下,所有字符串参数都被视为必需,除非我将它们拉入一个类,此时它们将恢复默认为Optional,除非我用IFoo装饰它们但我不能在这里做,因为这需要更改{{ 1}}或者会破坏我用这个控制器类实现IFoo的要求。

是否有一种直接的方法来实现Swagger& amp; Swagger UI很荣幸吗?我想避免这种愚蠢的解决方案:

public class FooController : ApiController, IFoo
{
    [Route("~/Foo/Bar")]
    [HttpGet]
    public string FakeBar(MyDto data)
    {
        return Bar(data.optionalA, data.requiredB);
    }

    [ApiExplorerSettings(IgnoreApi = true)]
    public string Bar(string optionalA, int requiredB)
    {
        return DoStuff(optionalA, requiredB);
    }
}

public class MyDto
{
    // defaults to optional here
    public string optionalA { get; set; }

    [Required]
    public int requiredB { get; set; }
}

我明白如果我可以重新排序A和B(这不是一个选项)那么简单的解决方案就是这样:

public string Bar(int requiredB, string optionalA = null)

1 个答案:

答案 0 :(得分:0)

我发现我无法做到这一点。我被迫改变界面或不实现接口或其他一些令人讨厌的东西导致额外的代码太多。在这个时候,我认为没有其他方法可以直接控制动作处理程序的参数要求。

欢迎任何纠正我的人! ; - )