Asp.net web api 当下列字符串输入不是可选的时,可选的字符串输入?

Asp.net web api 当下列字符串输入不是可选的时,可选的字符串输入?,asp.net-web-api,asp.net-web-api2,swagger,swagger-ui,swashbuckle,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 requir

我试图实现一个作为服务控制器的接口。我不维护此接口,因此无法修改它。为简单起见,假设界面如下所示:

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);
    }
}
对于我的控制器,假设它看起来像这样:

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);
    }
}
通过此设置,我如何在不更改
IFoo
(即无法重新排序A和B)的情况下,将
A
装饰为可选,将
B
装饰为所需,同时仍让我的控制器执行IFoo?默认情况下,所有字符串参数都被认为是必需的,除非我将它们拉到一个类中,在该类中,它们将恢复为默认值为可选值,除非我使用
RequiredAttribute
对它们进行修饰,但我不能在这里这样做,因为这需要更改
IFoo
,或者会破坏我使用
IFoo
实现的要求这是一个控制器类

有没有一种直接的方式可以做到这一点,以招摇过市&招摇过市用户界面尊重它?我希望避免这种骇人的解决方案:

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)

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


我很乐意听从任何纠正我的人!;-)

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


我很乐意听从任何纠正我的人!;-)

黑客的解决方案应该有效。您也可以这样做,这或多或少是相同的
公共字符串FakeBar(int requiredB,string optionalA=null){return Bar(optionalA,requiredB);}
当您从JS或其他客户机调用web API时,您正在按名称设置参数的值。正确的?那么为什么WebAPI方法中的参数顺序很重要呢?您应该能够像C#所要求的那样将可选参数放在末尾,而不会对调用程序产生影响API@GlennFerrie如果我这样做,那么我就不再用这个控制器类实现IFoo了。@Jaxidian,唯一的其他选择是创建特定于操作的操作过滤器,该过滤器将根据请求参数强制执行您想要的操作<代码>[MyFilter(Optional=“optionalA”)]选择加入或退出模式。过滤器可以根据规则允许请求抛出,也可以返回错误的请求found@Jaxidian看看这篇文章,看看你是否想走这条路。我通过一些集成测试进行了尝试,越是深入,我就越需要补充一点:为了弥补糟糕的设计,必须经历所有这些歌舞表演,最终是不值得的。我本来会公布答案的,但其中会包括我对设计的反对意见,我宁愿避免投反对票。您也可以这样做,这或多或少是相同的
公共字符串FakeBar(int requiredB,string optionalA=null){return Bar(optionalA,requiredB);}
当您从JS或其他客户机调用web API时,您正在按名称设置参数的值。正确的?那么为什么WebAPI方法中的参数顺序很重要呢?您应该能够像C#所要求的那样将可选参数放在末尾,而不会对调用程序产生影响API@GlennFerrie如果我这样做,那么我就不再用这个控制器类实现IFoo了。@Jaxidian,唯一的其他选择是创建特定于操作的操作过滤器,该过滤器将根据请求参数强制执行您想要的操作<代码>[MyFilter(Optional=“optionalA”)]选择加入或退出模式。过滤器可以根据规则允许请求抛出,也可以返回错误的请求found@Jaxidian看看这篇文章,看看你是否想走这条路。我通过一些集成测试进行了尝试,越是深入,我就越需要补充一点:为了弥补糟糕的设计,必须经历所有这些歌舞表演,最终是不值得的。我本来会公布答案的,但其中会包括我对设计的反对意见,我宁愿避免投反对票。