Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 调用API时重复反序列化和序列化-有更好的方法吗?_C#_Ajax_Serialization_Asp.net Core - Fatal编程技术网

C# 调用API时重复反序列化和序列化-有更好的方法吗?

C# 调用API时重复反序列化和序列化-有更好的方法吗?,c#,ajax,serialization,asp.net-core,C#,Ajax,Serialization,Asp.net Core,我正在开发一个网站和一个API来为it数据提供服务,我注意到我当前的过程涉及在进行API调用时重复序列化和反序列化相同的数据。我想知道是否有更好的方法来处理事情。网站和API都是使用ASP.NETCore2.0用C#编写的 我目前的程序如下: 1) 最终用户加载网站页面 2) AJAX调用是从客户端JavaScript发出的,调用网站中的C#函数 3) C#website函数调用API(使用一个由Swagger生成的客户端) 4) API序列化数据并将其作为JSON返回给网站 5) 网站中的Sw

我正在开发一个网站和一个API来为it数据提供服务,我注意到我当前的过程涉及在进行API调用时重复序列化和反序列化相同的数据。我想知道是否有更好的方法来处理事情。网站和API都是使用ASP.NETCore2.0用C#编写的

我目前的程序如下:

1) 最终用户加载网站页面

2) AJAX调用是从客户端JavaScript发出的,调用网站中的C#函数

3) C#website函数调用API(使用一个由Swagger生成的客户端)

4) API序列化数据并将其作为JSON返回给网站

5) 网站中的Swagger客户端将数据反序列化回POCO类

6) WebsiteC#函数将数据序列化回JSON,以将其返回到AJAX函数

7) 客户机中的JSON数据已经完成了一些操作——首先解析JSON之后不可避免地要完成

示例代码:

AJAX调用:

var xhr = new XMLHttpRequest();
xhr.open('get', "/GetData", true);
xhr.onload = function () {
    var data = JSON.parse(xhr.responseText);
    doSomething(data);
    }.bind(this);
xhr.send();
网站方法:

[Route("/GetData")]
public async Task<IActionResult> GetData()
{
    var data = await ApiClient.ApiDataGetAsync();
    return Json(data);
}
[Route(“/GetData”)]
公共异步任务GetData()
{
var data=await ApiClient.ApiDataGetAsync();
返回Json(数据);
}
API方法:

[HttpGet]
public Dictionary<int, string> GetData()
{
    return _logic.GetData();
}
[HttpGet]
公共字典GetData()
{
返回_logic.GetData();
}
如上所示,在Swagger客户端将数据反序列化为POCO之前,API将数据序列化为JSON,然后在网站中序列化回JSON,以便客户端进行处理

我意识到我可以通过直接从AJAX调用API而不是通过网站来简化这一点,但我宁愿避免这样做,原因有很多:

1) 它会将API与网站前端紧密耦合,目前我可以选择在网站中实现一个接口层,以简化将来需要更换API时的工作

2) 这将减少我对谁可以访问API的控制——目前它被IP地址锁定


有什么方法可以改进这个过程,这样在保留Swagger客户端的同时,数据就不必序列化两次吗?

好吧,您可以放弃客户端,只需使用
HttpClient
从API获取数据,将您的操作作为代理

客户机实际上是为了给您提供要使用的C#对象,因此它会序列化/反序列化请求/响应,以便您更容易使用API。这就是重点。你的意思是你实际上并不想要这个,所以干脆放弃这个客户


相反,您可以使用
HttpClient
从操作直接向API发出请求,然后简单地从
HttpClient
调用返回响应。由于API返回JSON,而您需要JSON,因此无需进行进一步处理。

好的,您可以放弃客户端,只需使用
HttpClient
从API获取操作,将您的操作作为代理

客户机实际上是为了给您提供要使用的C#对象,因此它会序列化/反序列化请求/响应,以便您更容易使用API。这就是重点。你的意思是你实际上并不想要这个,所以干脆放弃这个客户


相反,您可以使用
HttpClient
从操作直接向API发出请求,然后简单地从
HttpClient
调用返回响应。由于API返回JSON,而您需要JSON,因此无需进行进一步的处理。

您实际上想解决什么问题?与网络i/o所用的时间相比,序列化/反序列化json所用的时间很小


在这一点上,我想说,您正在尝试优化某些东西,而不知道它是否会提高应用程序性能或降低成本,这通常被认为是浪费时间。

您实际想要解决的问题是什么?与网络i/o所用的时间相比,序列化/反序列化json所用的时间很小


在这一点上,我想说的是,您正在尝试优化某些内容,而不知道它是否会提高应用程序性能或降低成本,这通常被认为是浪费时间。

您如何将其缩短?我不知道,我只是想知道是否可能。您如何将其缩短?我不知道,我只是想知道这是否可能。你可能是对的,这只是我认为是一个普通设计模式的一个奇怪方面。你可能是对的,这只是我认为是一个普通设计模式的一个奇怪方面。