1

我能够让 Service Stack 的 Hello World 示例正常工作,但现在我正在尝试稍微扩展它以返回自定义Site对象。我制作了一个简单的测试 html 文件,该文件使用 jQuery 来拉回结果,但我没有返回Site对象(我认为)。

这是我的网络服务:

using Funq;
using ServiceStack.ServiceInterface;
using ServiceStack.WebHost.Endpoints;
using System;

namespace My.WebService
{

    public class SiteRepository
    {

    }

    public class Site
    {
        public string Name { get; set; }
        public string Uri { get; set; } //switch to the real uri class if you find it useful
    }

    public class SiteService : Service //: RestServiceBase<Site>
    {
        public SiteRepository Repository { get; set; } //Injected by IOC

        public object Get(Site request)
        {
            //return new Site { Name = "Google", Uri = "http://www.google.com" };
            return new SiteResponse {Result = new Site {Name = "Google", Uri = "http://www.google.com"}};
        }
    }

    public class SiteResponse
    {
        public Site Result { get; set; }
    }

    public class SiteAppHost : AppHostBase
    {

        public SiteAppHost()
            : base("Site Web Services", typeof(SiteService).Assembly)
        {
        }

        public override void Configure(Container container)
        {
            container.Register(new SiteRepository());

            Routes
                .Add<Site>("/site")
                .Add<Site>("/site/{Id}/");
        }
    }

    public class Global : System.Web.HttpApplication
    {


        protected void Application_Start(object sender, EventArgs e)
        {
            new SiteAppHost().Init();
        }

        protected void Session_Start(object sender, EventArgs e)
        {

        }

        protected void Application_BeginRequest(object sender, EventArgs e)
        {

        }

        protected void Application_AuthenticateRequest(object sender, EventArgs e)
        {

        }

        protected void Application_Error(object sender, EventArgs e)
        {

        }

        protected void Session_End(object sender, EventArgs e)
        {

        }

        protected void Application_End(object sender, EventArgs e)
        {

        }
    }
}

这是使用 jQuery 的测试 HTML 文件。我添加了 ?callback=? 因为我正在同时运行 Web 服务和从同一台机器进行调用。

 <html>                                                                  
 <head>                                                                  
 <script type="text/javascript" src="http://code.jquery.com/jquery-1.9.1.min.js"></script>          
 <script type="text/javascript">                                         
    // we will add our javascript code here 
    $(document).ready(function() {
        // do stuff when DOM is ready
        alert("Hello world!");
        //the ?callback=? part is for testing on the same server as the web service
        $.getJSON("http://localhost:61549/site?callback=?", function(sitesReturned) {
            alert(sitesReturned);   // alert box contains:   [object Object]
            alert(sitesReturned.Name);  //alert box contains:  undefined
            alert(sitesReturned.length == 1) //alert box contains:  false
            var parsed = JSON.parse(sitesReturned); //this fails silently
            alert(parsed.Name); // the alert box does not load
        });

        alert("Goodbye world!");
    });                                    
 </script>                                                               
 </head>                                                                 
 <body>                                                                  
   <!-- we will add our HTML content here -->                                        
   Hello
 </body>                                                                 
 </html>
4

2 回答 2

1

一些笔记...

  • 但我没有返回 Site 对象(我认为)

$.getJSON 将有一个看起来像这样的响应

{"result":{"name":"Google","uri":"http://www.google.com"}}所以 name/uri 属性在result属性内。

alert(sitesReturned.result);   // will still contain [object Object]
alert(sitesReturned.result.name);  //should contain Google
alert(sitesReturned.result.uri.length == 1) //contains false since 21 != 1
  • 我正在运行 Web 服务并从同一台机器上进行调用。

不完全确定你的意思。如果您正在提供包含 jQuery 代码的 HTML 文件,则http://localhost:61549您不需要使用 JSONP。

  • var parsed = JSON.parse(sitesReturned); //这会静默失败

sitesReturned 参数已被解析为 JavaScript 对象,因此该行失败,因为它试图解析对象而不是字符串。请参阅此处的文档。此外,我没有看到参考或<script>标签,但我假设您使用 Douglas Crockford 的 JSON 库用于JSON.parse().

从文档:

“成功回调传递了返回的数据,该数据通常是由 JSON 结构定义并使用 $.parseJSON() 方法解析的 JavaScript 对象或数组。它还传递了响应的文本状态。”

于 2013-03-13T05:00:45.363 回答
0

我想通了。愚蠢的错误。

public class SiteService : Service //: RestServiceBase<Site>
    {
        public SiteRepository Repository { get; set; } //Injected by IOC

        public object Get(Site request)
        {
            //return new Site { Name = "Google", Uri = "http://www.google.com" };
            return new SiteResponse {Result = new Site {Name = "Google", Uri = "http://www.google.com"}};
        }
    }

本来应该

public class SiteService : IService //: RestServiceBase<Site>
    {
        public SiteRepository Repository { get; set; } //Injected by IOC

        public object Get(Site request)
        {
            //return new Site { Name = "Google", Uri = "http://www.google.com" };
            return new SiteResponse {Result = new Site {Name = "Google", Uri = "http://www.google.com"}};
        }
    }

我需要添加以下命名空间: using ServiceStack.ServiceHost;

于 2013-03-14T02:15:24.393 回答