如何从网页Javascript调用C#方法? [关闭]

Posted

技术标签:

【中文标题】如何从网页Javascript调用C#方法? [关闭]【英文标题】:How to call C# method from web page Javascript? [closed] 【发布时间】:2017-01-17 23:30:10 【问题描述】:

我的问题是我需要从网页发送 TCP 消息。出于安全原因,这是不可能的,因此我在已经作为生产环境的一部分运行的程序中编写了一个 C# 函数来发送 TCP 消息,并且我想通过网页调用该方法。我基本上需要托管一个 Web 服务并从网页中的 javascript 调用该 Web 服务中的 C# 函数。我怎样才能简单地做到这一点?

我查看了诸如 asp.net(我的网页是 GIANT Web 客户端的一部分,它不会也将无法使用 .aspx 文件)和 WCF(这对于简单地发送一个TCP 消息),但似乎没有人真正确定我在我已经制作的项目中调用 C# 函数的意图,从一个已经很大且相对不可更改的 Web 客户端。

请注意,我真正想做的是能够在我已经制作并计划部署的项目中调用 C# 代码,所以我希望能够将 REST 功能添加到那里的方法中,但是在某种程度上,我对现有项目之外的简单/智能解决方案也非常开放。

感谢您的指导!

【问题讨论】:

c# code 必须正在运行,即由某物托管。否则它只不过是磁盘上某处的 dll/exe 文件。因此,您可以将其作为 Windows 服务、控制台应用程序、将其托管在 IIS 等中运行。然后您可以修改该代码以侦听某些内容(TCP、HTTP 等),然后您可以弄清楚如何调用它。您可以说最终的答案将相当广泛,并且会因实施者而异。因此,这个问题不太适合 SO,如果您需要更一般的帮助,请将其发布在 Programmers SE 上或将您的问题缩小到特定细节。 @igor 他们可以将代码作为项目包含在具有某种 ASP.NET 项目(Web 服务、网站等)的解决方案中,然后从 ASP.NET 引用该项目项目。这将让他们处理 ASP.NET 项目中的 Web 内容(身份验证/授权、服务器设置等),并将他的原始 C# 函数分开,以防他们需要引用另一个项目的代码。 @maniak1982 我尝试过 ASP.NET,但无法从我的 javascript 调用我的 Web 服务。我还认为调用 ASP.NET Web 客户端的脚本必须从 ASP.NET 网页调用(Visual Studio 和教程似乎指向这一点),所以我已经放弃了这种方法,这就是我回来的原因寻找一般建议。如果我错了,请纠正我,因为如果我可以让任何旧 JS 在浏览器中运行以与我的 ASP.NET Web 服务对话,那么我很高兴,但到目前为止我还无法做到。 这个问题,尽管有答案,但过于宽泛,可能基于意见。确实有数百种方法可以让这种情况发生,但没有客观的“正确”答案。 我知道这很广泛,但仍然从发帖者那里得到了很好的指导,所以这个论坛对我很有帮助。当我进一步研究 ASP.NET 时会确认答案。任何允许我从我的 javascript 调用 C# 方法的方法的答案都是客观正确的。我在了解这一点并试图让它发挥作用时感到困惑的部分原因是“解决方案”/教程等的广泛性质,选择一个我确认是解决我的问题的好选择并解决它会很棒。 【参考方案1】:

您有很多选择,但我会选择 Web 服务,而我个人的偏好是 ASP.NET MVC Web API。我不知道到底要把你往哪个方向送下去,但你可以从这里开始,走得更远。使用 ASP.NET MVC 编写一个 RESTful Web API 是可能的,它是一个相对成熟的产品,拥有大量用户。

http://www.asp.net/web-api

http://www.asp.net/web-api/overview/older-versions/build-restful-apis-with-aspnet-web-api

至于调用 Web API 方法,您可以使用任何类型的 AJAX 调用。我自己通常使用 jQuery 的 AJAX 方法。

【讨论】:

这个。我正要自己推荐完全一样的。 您可以从任何旧脚本直接调用它,只要您将请求发送到正确的端点并且它包含有效数据。我喜欢在 Chrome F12 开发控制台中测试我的 AJAX 调用。请记住查看您收到的错误,并且您可以在 IIS 上进行调试(在项目 Web 属性中,您可以将服务器更改为本地 IIS)。寻找您收到的错误消息的答案,不要害怕使用试错法。 属性窗口的 Web 部分有一个创建虚拟目录按钮,用于在本地 IIS 上创建一个虚拟目录。如果选择本地 IIS 作为服务器,每个构建都将部署到 localhost。 我有时间一直在检查这个。看起来构建正在正确部署到本地主机,当我尝试使用 jQuery 的 AJAX 从 JS 访问该 url 时,我收到“跨源请求仅支持协议方案......”错误。再次感谢您的指导,现在去检查一下。希望这意味着它至少可以访问 Web 服务,如果还没有正确使用它的话。 是的,您正确地访问了 Web 服务,但是您没有为跨站点脚本正确配置它。它看到您正在从不同的域访问它并将您踢出。如果我没记错的话,那只是在 POST 请求上,而不是在 GET 上。如果您需要从一个站点拨打电话到另一个站点,请查看 CORS。我自己从来没有深入研究过,但你需要告诉网站它可以接受来自你的域(或子域,如果是这样的话)的请求。【参考方案2】:

最好的方法是通过soap/rest web服务直接调用ajax到你的应用程序。

还有一些从网站调用服务器应用程序的替代方法:

您的选择与世界上的服务器端服务一样多。在我看来,最简单的方法是对 php 文件进行 ajax 调用,该文件将运行对 C# 程序的调用。另一方面,就性能而言,它不会是最佳解决方案。您绝对应该考虑使用 NodeJS,因为它是一种完美的技术,可以让服务器端“服务器”处理服务器任务,并且可以很好地与浏览器调用(通过 ajax 或 socket.io)配合使用。如果您的 TCP 消息不太复杂,您可以在 Node 中重写它,或者直接从 Node 应用程序调用 C#。

PHP解决方案:

只需使用将执行您的程序的文件,例如 http://php.net/manual/en/function.exec.php

NodeJS:

有一个很棒的要点展示了如何发送 tcp 消息: https://gist.github.com/tedmiston/5935757

Ajax 调用:

您可以使用纯 javascript (http://www.w3schools.com/ajax/ajax_xmlhttprequest_send.asp) 或一些库,如 jQuery http://api.jquery.com/jquery.ajax/

Socket.io:

简单的 socket.io 示例:What is an example of the simplest possible Socket.io example?

注意:您需要保护访问权限,任何方式对服务器应用程序进行未经授权的调用都是非常不安全的。

【讨论】:

我会研究这些方法!我之前研究过一个名为 WebTCP 的库,它提供了通过 NodeJS 应用程序从 Web 浏览器发送 TCP 的方法。问题是我们(我的团队)不想或不想将 NodeJS 作为我们软件的操作开发/演示环境的一部分运行,绝对不是用于生产。虽然目前解决方案的重量越轻越好,所以我将再看看 NodeJS 和 PHP!谢谢。

以上是关于如何从网页Javascript调用C#方法? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何从 .aspx 页面 javascript 调用 C# 方法后面的 Web 窗体代码

C# webbrowser 里如何调用网页里的js函数?

C# 使用 HTTPWebRequest 拉取网页并从站点执行 javascript

如何从 jQuery 调用 C# 静态方法

如何在网页上嵌套java程序

c#的webbrowser调用本地javascript脚本?