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看看这篇文章,看看你是否想走这条路。我通过一些集成测试进行了尝试,越是深入,我就越需要补充一点:为了弥补糟糕的设计,必须经历所有这些歌舞表演,最终是不值得的。我本来会公布答案的,但其中会包括我对设计的反对意见,我宁愿避免投反对票。