【问题标题】:Consume JSON data (asmx) via C# page通过 C# 页面使用 JSON 数据 (asmx)
【发布时间】:2014-07-02 15:21:46
【问题描述】:

我有类似这样的代码:

[ScriptService]
public class Titles : WebService
{
    List<Title> Title = new List<Title>();

    SqlConnection connection;
    SqlCommand command;
    SqlDataReader reader;

    [WebMethod()]
    public List<Title> GetTitle()
    {
        var title = new List<Title>();

        using (connection = new SqlConnection(ConfigurationManager.AppSettings["connString"]))
        {
            using (command = new SqlCommand("some query here", connection))
            {
                connection.Open();

                using (reader = command.ExecuteReader())
                {
                    int col1Index = reader.GetOrdinal("col1");

                    while (reader.Read())
                    {
                        title.Add(new Title(reader.GetString(col1Index)));
                    }
                }
            }
        }

        return title;
    }
}

然后我可以使用 jQuery 来获取上述代码以返回 XML 或 JSON,例如:

$.ajax({
    url: '/webservices/titles.asmx/GetTitle',
    contentType: 'application/json; charset=utf-8',
    dataType: 'json',

通过将 jQuery 的 dataType 和 contentType 更改为 XML,上面的 web 服务将返回 XML 而不是 JSON。

我的问题是,我可以在标准 C# asp.net 页面中使用上述 Web 服务,以便我可以提取值并使用我想要的值,即简单的事情,例如让 Web 服务返回 JSON,然后获取 C#响应。将其写入屏幕?

【问题讨论】:

  • 通过c#页面你是指aspx还是cshtml?
  • 你不能在浏览器端使用 C#(你可以使用 Silverlight 等,但它不算数:) 你应该使用 JavaScript
  • @ChadCarisch,我的意思是 aspx。
  • 除非他想做服务器端的工作。在这种情况下,不需要 Web 服务。
  • @ArsenMkrt,我不能让 C# 在服务器端使用 Web 服务吗?

标签: c# jquery asp.net json .net-3.5


【解决方案1】:

默认情况下,ASMX 返回 SOAP,即 XML。不管你要求什么,它都不会被退回。

在 ASP.NET 世界中,您拥有更广泛的工具箱。如果您想要 JSON(和 XML?),您可以使用 Web API 返回数据。默认情况下,它是 JSON,应该在这里工作。 ASP.NET 内部还有一些神奇的方法可以让方法返回数据。 Web 表单的核心方法是 AJAX,但如果您更喜欢 JQuery,您也可以使用它。一切都在于了解如何返回 dat。

但是,使用 ASMX,您以 SOAP 的形式返回 XML。我见过有人(几年前)在 Web 服务中接管了一些内部结构并返回 JSON。这是一个大杂烩。它起作用了,但是当有多种方法可以解决它而不混淆 ASP.NET 的内部时,我不建议这样做。

我会从这里开始:http://encosia.com/using-jquery-to-consume-aspnet-json-web-services/

简单说明了如何在 ASP.NET 中使用 JQuery 使用 JSON。

【讨论】:

  • 看来我的问题不是很清楚。澄清一下,我已经使用 jquery 使用了该 Web 服务客户端。我只是想在服务器端使用相同的 Web 服务(因此我不必再次编写返回相同数据的类似代码)。
【解决方案2】:

您可以在服务器端执行以下操作

var results = (new Titles()).GetTitle();
// do stuff with results. 

请记住,这实际上不是 Web 服务的目的。

在一个 aspx 文件中,如下所示:

<%  var results = (new Titles()).GetTitle(); 
 foreach(var r in results){%>
       <div><!-- do stuff with each item in results --></div>
 <% }%>

【讨论】:

  • 基本上,我已经有我正在使用客户端的网络服务,但我还需要在服务器端使用相同的数据。我希望跳过一个步骤,直接使用现有的 web 服务,而不是再次编写代码。
  • 我想我不知道的主要事情是如何让 C# aspx 使用 web 服务(asmx 文件),然后才能使用它,如您的代码示例所示?
  • 您不需要将 asmx 用作服务。只需使用服务背后的类。
  • 我太厚了,对不起。我有一个 aspx 文件,我有一个 asmx 文件。不明白怎么在aspx文件中使用asmx文件中的代码。
  • @oshirowanen asmx 和 aspx 在同一个项目中吗?
【解决方案3】:

您当然可以通过 .aspx 页面使用 Web 服务 - 我能够做到这一点的最简单方法是通过以下代码使用 System.Net 命名空间中的 WebClient 对象:

        WebClient serviceRequest = new WebClient();
        string responseStr = "";
        responseStr = serviceRequest.DownloadString(new Uri("http://www.yourwebserver.com/yourwebservices/YourService.svc/json/getwhateverdatayouneed/" + passInAParameter));
        //I'm not really sure if these next 3 lines are needed, but to deserialize into a Data Table I had to do this string manipulation
        responseStr = responseStr.Replace("\\", "");
        responseStr = responseStr.Replace("\"[", "[");
        responseStr = responseStr.Replace("]\"", "]");
        DataTable dtMyDataFromService = JsonConvert.DeserializeObject<DataTable>(responseStr);

此示例还使用了 Newtonsoft.Json dll,您可以从 Nuget 下载它 - 这可能是 .NET 中最流行的用于序列化和反序列化 json 的库。假设您的 Web 服务返回一个 STRING(您真的不想在基于 JSON 的 Web 服务中使用本机 .NET 数据类型),上面的代码示例会将结果反序列化为 .aspx 页面上的 .NET 数据表。一旦你这样做了,根据你的问题,只需遍历数据表并将 Response.Write 写入屏幕(你也可以通过 Response.Write(responseStr) 编写原始 json)。

希望这会有所帮助! - JM

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2016-05-07
    • 1970-01-01
    • 2018-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多