使用 JavaScript 连接到 .NET 服务器

Posted

技术标签:

【中文标题】使用 JavaScript 连接到 .NET 服务器【英文标题】:Using JavaScript to connect to a .NET server 【发布时间】:2012-10-29 19:16:21 【问题描述】:

我应该使用我们服务器上的 JS 访问资源。我已经设置了下面的代码。

var targetUrl = "http://somePlace.com/actualResourceName";
var xdr = new XDomainRequest();
xdr.onload = function ()  alert(xdr.responseText); 
xdr.open("GET", targetUrl);
xdr.send();

但是,我不清楚如何创建另一端的方法。我提出了以下建议,完全意识到它不起作用。例如,我确定我缺少正确的属性。我什至不确定在哪里设置该方法应该对actualResourceName做出反应...

[???]
public String ActualResourceName()

  return "Bye, bye, cruel word!";

我已经用谷歌搜索了,但我没有找到任何解决方案。不过,我可能在没有意识到它有用的情况下偶然发现了它。

C#中的方法应该怎么写?

【问题讨论】:

我假设它是一个 REST 服务,用 C# 编写。这里使用什么类型的服务? ASP.NET WebApi?服务栈?或者甚至是 ASP.NET MVC?如果以上都不是,那么您将重新发明随之而来的痛苦和痛苦...... :) 您可能希望创建一个 WCF 服务,该服务将位于服务器端并响应来自客户端 javascript 的请求。如果没有人给你一个体面的答案,如果我有时间的话,我会在今晚晚些时候尝试发布一个完整的代码示例。以下链接为您提供了逐步演练,非常值得一读(有点长)msdn.microsoft.com/en-us/library/dd203052.aspx 我会推荐使用 ASP.NET Web API 来开发一个可以从 JavaScript/JQuery 调用的易于开发的 REST API。 ASP.NET Web API 是 ASP.NET 和 WCF 团队的共同努力,是 RESTful Web 服务的未来方向。关于如何创建 Web 服务和调用它的 JavaScript 的完整教程可以在这里找到asp.net/web-api/overview/getting-started-with-aspnet-web-api/… 【参考方案1】:

好的,就这样吧。我将描述完成它的两种方法,最简单的方法:

1. ASP.NET WebApi

您必须创建一个新的 ASP.NET MVC4 项目(无论是发布版还是 RC),选择“WebApi”作为选项:

您将准备好模板。现在您右键单击“控制器”文件夹,然后 添加 -> 控制器:

并填写例如像这样:

public class ActualResourceController : ApiController

    public string Get()
    
        return "Hey there! Getting the resource...";
    

默认路由在 Global.asax 中,当你去定义WebApiConfig.Register(...) 方法时,你会看到默认路由是host/api/controller。 让我们尝试一下,当您启动项目并进入(在我的情况下,端口由开发服务器自动选择)http://localhost:23030/api/ActualResource 你会得到:

<string>Hey there! Getting the resource...</string>

WebApi 根据 Accept 标头返回 JSON 或 XML,如果您希望 JSON 成为唯一/默认值,请采用 a look at this link.

您当然可以创建一个类并返回它,它将以类似于下面使用 ServiceStack 看到的方式序列化为 XML/JSON。


2. ServiceStack

现在 ServiceStack 是功能强大的开源 REST Web 服务框架。它的工作方式与 WebApi 有点不同,这里简单介绍一下(虽然文档很好):

创建常规的 ASP.NET MVC 项目(在我的例子中是 MVC4) - 你将有一个空模板:

然后启动包管理器控制台并输入(如文档建议的那样)Install-Package ServiceStack.Host.Mvc,这将为您提供一个带有教程应用程序的 ServiceStack 项目模板,如果您愿意,您可以稍后将其删除。

但首先,ServiceStack 在 DTO、Request-Response 对象上工作。所以让我们创建它们,ActualResource 类将作为请求,ActualResourceResponse 将作为响应。由于您在请求中没有参数,因此第一个是微不足道的:

public class ActualResource


任何参数都是自动属性。现在回复:

public class ActualResourceResponse

    public string ResourceName  get; set; 

还有服务类本身:

public class ActualResourceService : Service

    public object Get(ActualResource request)
    
        return new ActualResourceResponse 
           ResourceName = "Hi! It's the resource name." ;
    

您当然可以为您当前的目的返回裸string,它的工作原理都是一样的。

现在在ServiceStack创建的模板中,一切都发生在AppHost.cs文件中,让我们看一下并稍微修改一下:

Routes
    .Add<Hello>("/hello") 
    .Add<Hello>("/hello/Name*")
    .Add<Todo>("/todos")
    .Add<Todo>("/todos/Id") //everything up to here are a template/tutorial routes, you can safely remove them
    .Add<ActualResource>("/actualResource"); //and here you add a route to your own service

为了让它工作,你必须去 Global.asax 并注释掉整个 WebApiConfig.Register(GlobalConfiguration.Configuration) 行,然后进入 RouteConfig.RegisterRoutes 方法并添加:

 routes.IgnoreRoute("resource.axd/*pathInfo");
 routes.IgnoreRoute("api/*pathInfo"); // <<<---- this line
 routes.MapRoute(
      name: "Default",
      url: "controller/action/id",
      defaults: new  controller = "Home", action = "Index", id = UrlParameter.Optional 
  );

需要多一点管道,但还不错。

现在当你启动服务时,进入localhost:whateverport/api/actualResource,你会得到熟悉的字符串,下面是截图:

ServiceStack可以序列化成各种格式,所以如果你去http://localhost:yourPort/api/actualResource?format=json下,你会得到:

"resourceName":"Hi! It's the resource name."

如果?format=xml,那么:

<ActualResourceResponse>
    <ResourceName>Hi! It's the resource name.</ResourceName>   
</ActualResourceResponse>

等等……

现在 ServiceStack 设置有点复杂,但它支持例如Memcache 开箱即用,您可以在 Redis 中使用,可以使用各种身份验证提供程序,所有这些在某些场景中可能非常有用。但是,正如本叔叔曾经说过的,“权力越大,责任越大”,而且设置阶段有点困难......


现在你可以选择任何你喜欢的,这两个是目前最简单的选择,恕我直言。当然,这只是一个简单的入门教程,当您开始项目时,您将有机会深入探索这个主题。

【讨论】:

很好奇为什么您认为 ServiceStack 的设置更复杂?只需一行即可注册您选择的 Memcached 或 Redis ICacheClient 等,并且每个 Auth Provider 注册都是一行配置。 @mythz 比 completely 准备好的、开箱即用的 WebApi 稍微复杂一些,但(可能)因为它更可定制。但不要误会我的意思,我使用 ServiceStack 并且我非常喜欢它——尽管你可以使用 MVC 4 的一些文档更新——例如您必须完全注释掉 API 路由注册才能使其工作 - 或者可能将其更改为不同的路由,我不太确定,我并没有真正进入它。这是一个小细节,我知道,但它仍然必须完成。 :) 感谢您对新 API 的更正。 WebApi 如何完全准备好?使用 Redis 或 Memcached 需要什么?而且我无法想象不同的身份验证提供程序也可以开箱即用?我将研究 MVC4,可能需要 wiki 文档/NuGet 更新。 @mythz 你创建了这个项目,它只是工作,不需要改变——这就是我的意思。也没有太多的定制。因此,乍一看可能会更容易上手,但是当您浏览文档并拥有入门模板时,ServiceStack 非常有意义。虽然我不得不说文档一开始让我对带有属性的服务([Route=])、RestServiceBase 以及现在的新 API 感到有些困惑,但其他一切都很容易实现。 :) 我必须赶上变化... 好吧,你的意思是使用 VS.NET 项目模板就可以了?不是说缓存+身份验证提供程序已经准备好开箱即用了吗?我们将在明年推出 VS.NET 支持时改进这一点。

以上是关于使用 JavaScript 连接到 .NET 服务器的主要内容,如果未能解决你的问题,请参考以下文章

使用 Javascript 连接到 XMPP 服务器

如何使用服务帐户将 .net 应用程序连接到数据库

使用 Active Directory 服务帐户从 .NET 连接到 SQL Server

使用 .NET 连接到 Informix

使用 JavaScript 将 Websocket 连接到 Qt Fortune Server

Javascript 客户端如何连接到 PHP 套接字服务器?