使用JavaScript连接到.NET服务器

4

我需要使用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#中应该如何编写这个方法?

我假设这将是一个用C#编写的REST服务。这里使用了什么类型的服务?ASP.NET WebApi?Service Stack?还是甚至是ASP.NET MVC?如果以上都不是,那么你需要重新发明轮子并承受相应的痛苦... :) - Patryk Ćwiek
2
你可能想创建一个 WCF 服务,它将位于服务器端并响应来自客户端 JavaScript 的请求。如果没有人给出一个合适的答案,我会尝试在今晚稍后发布一个完整的代码示例,如果我有时间的话。以下链接提供了一个逐步指南,值得阅读(有点长)http://msdn.microsoft.com/en-us/library/dd203052.aspx - Kevin Brydon
1
我建议使用ASP.NET Web API来开发易于开发的REST API,可以从JavaScript / JQuery调用。 ASP.NET Web API是ASP.NET和WCF团队的共同努力,是RESTful web服务的未来方向。有关如何创建Web服务和调用它的JavaScript的完整教程可以在此处找到http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-api - Kevin Junghans
1个回答

5

好的,接下来我将描述两种最简单的方法来完成它:

1. ASP.NET WebApi

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

然后您就会有模板准备好了。现在右键单击“Controllers”文件夹,然后 添加 -> 控制器: enter image description here

然后填写如下内容:

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成为唯一的/默认的,可以参考这个链接

当然,你也可以创建一个类并返回它,它将以与ServiceStack类似的方式序列化为XML/JSON。


2. ServiceStack

现在ServiceStack是一个强大的、开源的REST Web服务框架。它和WebApi有一些不同之处,这里是一个快速介绍(尽管文档很好):

创建常规的ASP.NET MVC项目(在我的情况下,是MVC4)- 你将拥有一个空模板:

service stack startup project

请打开程序包管理器控制台,输入以下命令(如文档所示):Install-Package ServiceStack.Host.Mvc,这将为您提供一个ServiceStack项目模板和教程应用程序等内容,如果您希望,稍后可以将其删除。
但首先,ServiceStack基于DTOs,即请求-响应对象。因此,我们需要创建它们,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 reply page

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更难设置?它只需要1行代码来注册您选择的Memcached或Redis ICacheClient等,每个Auth Provider注册都是一行配置。 - mythz
@mythz 比起完全准备好的WebApi,它可能会更加复杂一些,但也因此更加可定制化。但是不要误解,我使用ServiceStack并且非常喜欢它 - 尽管你需要对MVC 4进行一些文档更新 - 例如,你必须完全注释掉API路由注册才能使其正常工作 - 或者将其更改为不同的路由,我不太确定,我没有深入研究过。我知道这只是一个小细节,但仍然需要完成。 :) 谢谢你对新API的纠正。 - Patryk Ćwiek
WebApi如何才能完全准备好?使用Redis或Memcached需要什么?我无法想象不同的Auth提供商可以直接开箱即用?我会研究MVC4,可能需要维基文档/NuGet更新。 - mythz
@mythz 你创建了这个项目,它就可以正常工作,不需要进行任何修改 - 这就是我的意思。也没有太多的自定义。因此,可能更容易一眼看出来,但是当您阅读文档并拥有起始模板时,ServiceStack非常有意义。虽然我必须说,最初使用带有属性([Route=])、RestServiceBase和现在的新API的服务时,文档让我有点困惑,但其他所有内容都很容易实现。 :) 我将不得不跟上这些变化... - Patryk Ćwiek
好的,你的意思是使用VS.NET项目模板就可以工作了?缓存和身份验证提供程序不是开箱即用的吗?明年我们推出VS.NET支持时,我们将改进这一点。 - mythz
@mythz 没错,就是这样。很高兴知道它将得到改进,尤其是现在已经不错了。 :) - Patryk Ćwiek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接