我班级的一系列字符串属性不会出现在CSV中
我正在使用CSVHelper(VER:27.2.1)。 我有一个get api,我正在尝试启用文本/CSV接受标头。因此,当我以Accept Header为文本/CSV向Postman发出GET请求时,我会得到CSV响应。 因此,我创建了一个CSV输出格式化器,并在program.cs中添加到了我的outputforamtters集合中。
下面的代码工作正常,除了在我的响应CSV中,我没有得到角色标题或值。它被完全忽略了。
我尝试创建一个地图并将其与RegisterClassMap一起使用,但是当我这样做时,API本身就停止工作。我的意思是,一旦我
csvWriter.Context.RegisterClassMap<CSVMap>();
在WriteresponsebodyAsync方法中介绍。 API停止返回CSV结果。
我有一个具有多个属性的课程。
public class Employee {
public string Name{get;set;}
public string[] Roles {get;set;}
public Employer company {get;set;}
}
public class Employer{
public string EmpPloyerName {get;set;}
}
我的csvoutputformatter看起来像下面-----------&gt;
public class CsvOutputFormatter : TextOutputFormatter
{
public CsvOutputFormatter()
{
SupportedMediaTypes.Add(MediaTypeHeaderValue.Parse("text/csv"));
SupportedEncodings.Add(Encoding.UTF8);
SupportedEncodings.Add(Encoding.Unicode);
}
protected override bool CanWriteType(Type type)
{
if (typeof(IEnumerable).IsAssignableFrom(type))
{
return base.CanWriteType(type);
}
return false;
}
public override async Task WriteResponseBodyAsync(OutputFormatterWriteContext context, Encoding selectedEncoding)
{
var streamWriter = new StreamWriter(context.HttpContext.Response.Body, selectedEncoding, leaveOpen: true);
await using (var csvWriter = new CsvWriter(streamWriter, new CsvConfiguration(System.Globalization.CultureInfo.InvariantCulture)))
{
//csvWriter.Context.RegisterClassMap<CSVMap>();
await csvWriter.WriteRecordsAsync((IEnumerable)context.Object);
}
}
public class CSVMap : ClassMap<Employee>
{
public CSVMap()
{
AutoMap(System.Globalization.CultureInfo.InvariantCulture);
Map(m => m.Roles).Convert(row => string.Join(",", row.Value.Roles));
}
}
输出格式登记在program.cs ---&gt;
builder.Services.AddControllers(
options =>
{
options.RespectBrowserAcceptHeader = true;
options.OutputFormatters.Add(new CsvOutputFormatter());
});
I am using CsvHelper (ver: 27.2.1).
I have a Get API and i am trying to enable text/csv Accept header. So that when I initiate a Get Request from Postman with Accept header as text/csv, I get a CSV response.
So I created a CSV output formatter and added to my outputforamtters collection in Program.cs.
The piece of code below is working fine except that in my response csv i am not getting the Roles header or the value. It's completely ignored.
I tried creating a Map and use it with RegisterClassMap but when i do that the api itself stops working. I mean as soon as i introduce
csvWriter.Context.RegisterClassMap<CSVMap>();
in WriteResponseBodyAsync method. The api stops returning csv result.
I have a class with multiple properties.
public class Employee {
public string Name{get;set;}
public string[] Roles {get;set;}
public Employer company {get;set;}
}
public class Employer{
public string EmpPloyerName {get;set;}
}
My CsvOutputFormatter looks like below ---------->
public class CsvOutputFormatter : TextOutputFormatter
{
public CsvOutputFormatter()
{
SupportedMediaTypes.Add(MediaTypeHeaderValue.Parse("text/csv"));
SupportedEncodings.Add(Encoding.UTF8);
SupportedEncodings.Add(Encoding.Unicode);
}
protected override bool CanWriteType(Type type)
{
if (typeof(IEnumerable).IsAssignableFrom(type))
{
return base.CanWriteType(type);
}
return false;
}
public override async Task WriteResponseBodyAsync(OutputFormatterWriteContext context, Encoding selectedEncoding)
{
var streamWriter = new StreamWriter(context.HttpContext.Response.Body, selectedEncoding, leaveOpen: true);
await using (var csvWriter = new CsvWriter(streamWriter, new CsvConfiguration(System.Globalization.CultureInfo.InvariantCulture)))
{
//csvWriter.Context.RegisterClassMap<CSVMap>();
await csvWriter.WriteRecordsAsync((IEnumerable)context.Object);
}
}
public class CSVMap : ClassMap<Employee>
{
public CSVMap()
{
AutoMap(System.Globalization.CultureInfo.InvariantCulture);
Map(m => m.Roles).Convert(row => string.Join(",", row.Value.Roles));
}
}
Output Formatter registering in Program.cs--->
builder.Services.AddControllers(
options =>
{
options.RespectBrowserAcceptHeader = true;
options.OutputFormatters.Add(new CsvOutputFormatter());
});
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论