1

Service Stack の Hello World の例を機能させることができましたが、今はそれを少し拡張して、カスタムのSiteオブジェクトを返そうとしています。jQuery を使用して結果を取得する簡単なテスト html ファイルを作成しましたが、Siteオブジェクトが返されません (と思います)。

ここに私のWebサービスがあります:

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 に答える