.net core web api returns 只有明文,应该根据客户端能力
.net core web api returns only clear text, should be based on client capabilities
我正在编写一个非常轻量级的 Web api 来呈现小型日志文件数据。
不涉及数据库。而且它必须基于 Kestral。 (可选的 IIS)。数据不需要删除或编辑,它只是关于数据的查看。并且根据客户端请求,它应该生成原始数据或对其进行 html 格式化,以便能够通过显示可点击的日志文件名(单击日志文件并查看其内容)来更深入地研究日志文件。
我是 .net 核心的新手,所以我有疑问,显然我在这里做错了什么,我试图根据客户端功能做出响应,但没有成功。
即使在尝试强制执行 HTML 编码时,我仍不断收到纯文本回复,这对于 telnet(直接 api 调用)来说是可以的,但是在 Firefox/chrome/Edge 中,有什么东西吗我需要做额外的事情吗?
使其在网络浏览器中作为 HTML 回复工作
所以我写了一个 ASP netcore 程序,如:
<!-- begin snippet: js hide: true --> //code collaps ?
namespace Dataview //this is the file : program.cs
{
public class Program
{
public static void Main(string[] args)
{
var configuration = new ConfigurationBuilder()
.AddCommandLine(args)
.Build();
var hostUrl = configuration["hosturl"];
if (string.IsNullOrEmpty(hostUrl)) hostUrl = "http://192.168.10.60:9000";
string port = hostUrl.Split(":")[2];
System.Diagnostics.Process.Start("cmd", "/C netsh advfirewall firewall add rule name=\"Http Logger Port\" dir=in action=allow protocol=TCP localport="+port);
BuildWebHost(args, hostUrl).Run();
}
public static IWebHost BuildWebHost(string[] args, string hostUrl) =>
WebHost.CreateDefaultBuilder(args)
.UseKestrel()
.UseUrls(hostUrl).UseIISIntegration()
.UseStartup<Startup>()
.Build();
}
}
我的值控制器程序 ValuesController.cs 看起来像:
namespace Dataview.Controllers
{
[Route("api/[controller]")]
public class ValuesController : Controller
{
const string LogFolder = @"C:\Data\Count";
String[] result = Directory.GetFiles(LogFolder);
// GET api/values
[HttpGet]
public string Get()//System.Net.Http.HttpResponseMessage Get()
{
var sb = new System.Text.StringBuilder();
sb.Append("<html><body>"); //trying to enforce HTML decoration=> doesnt work
for (int i = 0; i < result.Length; i++)
{
sb.Append($"<div><a href='{Url.Link("DefaultApi", new { Action = "", id = i })}'>{Path.GetFileName(result[i])}</div>");
}
sb.Append("</body></html>");
string answer = sb.ToString();
for (int i = 0; i < result.Length; i++) result[i] = Path.GetFileName(result[i]);
return answer;
}
// GET api/values/5
[HttpGet("{id}")]
public string Get(int id)
{
string[] lines = System.IO.File.ReadAllLines(result[id]);
string answer = "Showing : " + result[id] + "\n" + string.Join('\n', lines);
return answer;
}
===更新===
我设法通过更改控制器代码获得 Json 结果,但是显示的列表也不可点击(也没有 HTML 装饰):
[Route("api/[controller]")]
public class ValuesController : Controller
{
const string LogFolder = @"C:\Data\Count";
String[] result = Directory.GetFiles(LogFolder);
// GET api/values
[HttpGet]
public JsonResult Get()//System.Net.Http.HttpResponseMessage Get() //IEnumerable<string>
{
List<string> allFiles = System.IO.Directory.GetFiles(LogFolder).ToList();
allFiles.Reverse(); //newest on top
return Json(allFiles) ;
在 .net 核心中 ASP MCV 2.0.x 无法单击从 [HTTPGET] 检索到的 Json 列表。因为.net core 1.0
存在跨站脚本漏洞
虽然有人使用路由解决它,并为网络结果创建特定路由,并为网络提供不同的路由 API。
每个人都有一个网站http://x.x.x.x/Api/valeus
=> Json 与 GET/PUT
互动
有网站http://x.x.x.x/Web/Welcome
=> 对于网页结果,.interact with Views MVC (razor pages)。
其他路线也是可能的,具体取决于您的路线过滤器
路由可以基于客户端功能,..我认为但这在很大程度上取决于客户端浏览器,创建基于清晰路径的路由可能需要更多工作,但要保持清晰。
PS 开箱即用的模板可能更容易使用。
但是如果你不能使用它(就像我的情况一样)那么我希望上面的内容有用
我正在编写一个非常轻量级的 Web api 来呈现小型日志文件数据。 不涉及数据库。而且它必须基于 Kestral。 (可选的 IIS)。数据不需要删除或编辑,它只是关于数据的查看。并且根据客户端请求,它应该生成原始数据或对其进行 html 格式化,以便能够通过显示可点击的日志文件名(单击日志文件并查看其内容)来更深入地研究日志文件。
我是 .net 核心的新手,所以我有疑问,显然我在这里做错了什么,我试图根据客户端功能做出响应,但没有成功。
即使在尝试强制执行 HTML 编码时,我仍不断收到纯文本回复,这对于 telnet(直接 api 调用)来说是可以的,但是在 Firefox/chrome/Edge 中,有什么东西吗我需要做额外的事情吗? 使其在网络浏览器中作为 HTML 回复工作
所以我写了一个 ASP netcore 程序,如:
<!-- begin snippet: js hide: true --> //code collaps ?
namespace Dataview //this is the file : program.cs
{
public class Program
{
public static void Main(string[] args)
{
var configuration = new ConfigurationBuilder()
.AddCommandLine(args)
.Build();
var hostUrl = configuration["hosturl"];
if (string.IsNullOrEmpty(hostUrl)) hostUrl = "http://192.168.10.60:9000";
string port = hostUrl.Split(":")[2];
System.Diagnostics.Process.Start("cmd", "/C netsh advfirewall firewall add rule name=\"Http Logger Port\" dir=in action=allow protocol=TCP localport="+port);
BuildWebHost(args, hostUrl).Run();
}
public static IWebHost BuildWebHost(string[] args, string hostUrl) =>
WebHost.CreateDefaultBuilder(args)
.UseKestrel()
.UseUrls(hostUrl).UseIISIntegration()
.UseStartup<Startup>()
.Build();
}
}
我的值控制器程序 ValuesController.cs 看起来像:
namespace Dataview.Controllers
{
[Route("api/[controller]")]
public class ValuesController : Controller
{
const string LogFolder = @"C:\Data\Count";
String[] result = Directory.GetFiles(LogFolder);
// GET api/values
[HttpGet]
public string Get()//System.Net.Http.HttpResponseMessage Get()
{
var sb = new System.Text.StringBuilder();
sb.Append("<html><body>"); //trying to enforce HTML decoration=> doesnt work
for (int i = 0; i < result.Length; i++)
{
sb.Append($"<div><a href='{Url.Link("DefaultApi", new { Action = "", id = i })}'>{Path.GetFileName(result[i])}</div>");
}
sb.Append("</body></html>");
string answer = sb.ToString();
for (int i = 0; i < result.Length; i++) result[i] = Path.GetFileName(result[i]);
return answer;
}
// GET api/values/5
[HttpGet("{id}")]
public string Get(int id)
{
string[] lines = System.IO.File.ReadAllLines(result[id]);
string answer = "Showing : " + result[id] + "\n" + string.Join('\n', lines);
return answer;
}
===更新===
我设法通过更改控制器代码获得 Json 结果,但是显示的列表也不可点击(也没有 HTML 装饰):
[Route("api/[controller]")]
public class ValuesController : Controller
{
const string LogFolder = @"C:\Data\Count";
String[] result = Directory.GetFiles(LogFolder);
// GET api/values
[HttpGet]
public JsonResult Get()//System.Net.Http.HttpResponseMessage Get() //IEnumerable<string>
{
List<string> allFiles = System.IO.Directory.GetFiles(LogFolder).ToList();
allFiles.Reverse(); //newest on top
return Json(allFiles) ;
在 .net 核心中 ASP MCV 2.0.x 无法单击从 [HTTPGET] 检索到的 Json 列表。因为.net core 1.0
存在跨站脚本漏洞虽然有人使用路由解决它,并为网络结果创建特定路由,并为网络提供不同的路由 API。
每个人都有一个网站http://x.x.x.x/Api/valeus
=> Json 与 GET/PUT
有网站http://x.x.x.x/Web/Welcome
=> 对于网页结果,.interact with Views MVC (razor pages)。
其他路线也是可能的,具体取决于您的路线过滤器 路由可以基于客户端功能,..我认为但这在很大程度上取决于客户端浏览器,创建基于清晰路径的路由可能需要更多工作,但要保持清晰。
PS 开箱即用的模板可能更容易使用。 但是如果你不能使用它(就像我的情况一样)那么我希望上面的内容有用