使用 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 或 RedisICacheClient
等,并且每个 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 服务器的主要内容,如果未能解决你的问题,请参考以下文章
使用 Active Directory 服务帐户从 .NET 连接到 SQL Server