AutoRest生成C#模型时multipart/form-data含字符串枚举报错
问题:AutoRest生成C#客户端时,multipart/form-data中的枚举字段触发未实现异常
我尝试通过OpenAPI规范YAML文件生成C#模型与客户端,当multipart/form-data类型的请求体包含如下字符串枚举类型的Precedence属性时:
requestBody: required: true content: multipart/form-data: schema: type: object properties: Precedence: type: string enum: - PRIMARY - SECONDARY - COMMON
执行生成命令会抛出System.NotImplementedException错误,完整错误栈如下:
fatal | System.NotImplementedException: The method or operation is not implemented. at AutoRest.CSharp.Output.Models.RestClientBuilder.BuildRequestBody(IReadOnlyCollection`1 allParameters, BodyMediaType bodyMediaType, OutputLibrary library) in D:\a\_work\1\s\autorest.csharp\src\AutoRest.CSharp\Common\Output\Models\RestClientBuilder.cs:line 285 at AutoRest.CSharp.Output.Models.RestClientBuilder.BuildRequest(InputOperation operation, IReadOnlyCollection`1 requestParts, Parameter bodyParameter, OutputLibrary library) in D:\a\_work\1\s\autorest.csharp\src\AutoRest.CSharp\Common\Output\Models\RestClientBuilder.cs:line 212 at AutoRest.CSharp.Output.Models.RestClientBuilder.BuildMethod(InputOperation operation, DataPlaneResponseHeaderGroupType responseHeaderModel) in D:\a\_work\1\s\autorest.csharp\src\AutoRest.CSharp\Common\Output\Models\RestClientBuilder.cs:line 113 at AutoRest.CSharp.Output.Models.DataPlaneRestClient.EnsureNormalMethods() in D:\a\_work\1\s\autorest.csharp\src\AutoRest.CSharp\DataPlane\Output\DataPlaneRestClient.cs:line 44 at System.Lazy`1.ViaFactory(LazyThreadSafetyMode mode) at System.Lazy`1.ExecutionAndPublication(LazyHelper executionAndPublication, Boolean useDefaultConstructor) at System.Lazy`1.CreateValue() at AutoRest.CSharp.Output.Models.RestClient.GetOperationMethod(InputOperation request) in D:\a\_work\1\s\autorest.csharp\src\AutoRest.CSharp\Common\Output\Models\RestClient.cs:line 107 at AutoRest.CSharp.Output.Models.RestClient.BuildAllMethods()+MoveNext() in D:\a\_work\1\s\autorest.csharp\src\AutoRest.CSharp\Common\Output\Models\RestClient.cs:line 45 at System.Collections.Generic.LargeArrayBuilder1.AddRange(IEnumerable1 items) at System.Collections.Generic.EnumerableHelpers.ToArray[T](IEnumerable`1 source) at AutoRest.CSharp.Output.Models.RestClient.getMethods() in D:\a\work\1\s\autorest.csharp\src\AutoRest.CSharp\Common\Output\Models\RestClient.cs:line 24 at AutoRest.CSharp.Generation.Writers.RestClientWriter.WriteClient(CodeWriter writer, DataPlaneRestClient restClient) in D:\a\_work\1\s\autorest.csharp\src\AutoRest.CSharp\Common\Generation\Writers\RestClientWriter.cs:line 32 at AutoRest.CSharp.AutoRest.Plugins.DataPlaneTarget.Execute(GeneratedCodeWorkspace project, CodeModel codeModel, SourceInputModel sourceInputModel, SchemaUsageProvider schemaUsageProvider) in D:\a\_work\1\s\autorest.csharp\src\AutoRest.CSharp\DataPlane\AutoRest\DataPlaneTarget.cs:line 55 at AutoRest.CSharp.AutoRest.Plugins.CSharpGen.ExecuteAsync(CodeModel codeModel) in D:\a\_work\1\s\autorest.csharp\src\AutoRest.CSharp\Common\AutoRest\Plugins\CSharpGen.cs:line 38 at AutoRest.CSharp.AutoRest.Plugins.CSharpGen.Execute(IPluginCommunication autoRest) in D:\a\_work\1\s\autorest.csharp\src\AutoRest.CSharp\Common\AutoRest\Plugins\CSharpGen.cs:line 128 at AutoRest.CSharp.AutoRest.Plugins.PluginProcessor.Start(IPluginCommunication autoRest) in D:\a\_work\1\s\autorest.csharp\src\AutoRest.CSharp\Common\AutoRest\Plugins\PluginProcessor.cs:line 39 fatal | Process() cancelled due to failure
使用的生成命令:autorest --input-file=swagger.yaml --csharp --generation1-convenience-client
移除枚举定义后,生成可正常执行。
临时解决方案
- 先移除YAML中的枚举定义,将
Precedence改为普通字符串类型,生成代码后再手动将该字段替换为对应的C#枚举类型 - 将
Precedence枚举字段从multipart/form-data请求体中提取为URL查询参数,避免在表单数据中使用枚举类型
内容的提问来源于stack exchange,提问作者Akash Rawat
相关产品推荐
相关产品推荐

