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#中的方法应该怎么写?

4

1 回答 1

5

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

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 成为唯一/默认值,请查看此链接。

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


2.服务栈

现在,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 回复页面

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 中使用,你可以使用各种身份验证提供程序,所有这些在某些场景中可能非常有用。但是,正如本叔叔曾经说过的,“权力越大,责任越大”,而且设置阶段有点困难……


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

于 2012-11-09T15:47:19.983 回答