có bất kỳ ví dụ hay nào về cách sử dụng Google App Engine từ Silverlight hay không, tốt nhất là không cần viết các dịch vụ web tùy chỉnh?Google App Engine trên Silverlight
Cheers
Nik
có bất kỳ ví dụ hay nào về cách sử dụng Google App Engine từ Silverlight hay không, tốt nhất là không cần viết các dịch vụ web tùy chỉnh?Google App Engine trên Silverlight
Cheers
Nik
Tôi đang suy nghĩ về làm điều tương tự, nhưng tôi đã không đi qua bất cứ điều gì được nêu ra.
Tôi đang nghĩ về việc sử dụng JSON.net cho các dấu phẩy, vì vậy về cơ bản viết một dịch vụ REST trong GAE để khách hàng gọi và có thể OAuth.NET để xác thực (trừ khi tôi có thể tìm thấy cổng .NET của google one, tôi chưa xem được)
Silverlight về cơ bản chỉ là .NET, tho một phiên bản lite của nó, vì vậy nếu bạn có thể tìm thấy mã .NET để làm điều gì đó, nó sẽ hoạt động, ít nhất là một chút, trong SL:)
Nhưng điều đó càng xa càng tốt - hãy nghĩ về điều đó. Rất tiếc, bạn chưa thể trợ giúp thêm!
Tôi cũng đang xem xét điều này. Có một số dự án REST cho GAE, tôi chưa thử bất kỳ dự án nào trong số chúng, nhưng hy vọng vào tuần tới.
http://code.google.com/p/app3/
Tải về bản demo cho Expression Blend. Kiểm tra hướng dẫn đi kèm để cho biết cách tạo giao diện Silverlight tuyệt đẹp trong chế độ GUI và tích hợp nó với dịch vụ web tìm kiếm Bing. Thao tác ví dụ này thành một ví dụ của Google nên tầm thường. Chúc may mắn! :)
Đây là cách tiếp cận của tôi dựa chủ yếu vào Scott Seely's post Đơn giản chỉ cần gửi XML xung quanh, .xap cũng được cung cấp bởi GAE. Tôi chỉ làm việc này ngày hôm qua vì vậy nó vẫn đang hoạt động.
Google:
app.yaml
application: wowbosscards
version: 1
runtime: python
api_version: 1
handlers:
- url: /WowBossCards.html
static_files: WowBossCards.html
upload: WowBossCards.html
mime_type: text/html
- url: /clientaccesspolicy.xml
static_files: clientaccesspolicy.xml
upload: clientaccesspolicy.xml
mime_type: text/xml
- url: /WowBossCards.xap
static_files: WowBossCards.xap
upload: WowBossCards.xap
mime_type: application/x-silverlight-app
- url: .*
script: wowbosscards.py
wowbosscards.py
#!/usr/bin/env python
import cgi
import datetime
import wsgiref.handlers
import os
import logging
import string
import urllib
from google.appengine.ext import db
from google.appengine.api import users
from google.appengine.ext import webapp
from google.appengine.ext.webapp import template
class Xml(db.Model):
xmlContent = db.TextProperty()
date = db.DateTimeProperty(auto_now_add=True)
class XmlCrud(webapp.RequestHandler):
def get(self, xmlType):
xmlKey = string.capitalize(xmlType)
xml = Xml.get_by_key_name(xmlKey)
self.response.headers['Content-Type'] = "application/xml"
self.response.out.write(xml.xmlContent)
def post(self, xmlType):
logging.debug("XmlCrud POST")
xmlKey = string.capitalize(xmlType)
xml = Xml.get_by_key_name(xmlKey)
if len(self.request.get('content')) > 0 :
xml.xmlContent = self.request.get('content')
else:
xml.xmlContent = self.request.body
xml.put()
self.redirect('/upload/' + xmlType)
def main():
Xml.get_or_insert("Bosses", xmlContent="<a>Bosses go here</a>")
Xml.get_or_insert("Dungeons", xmlContent="<a>Dungeons go here</a>")
application = webapp.WSGIApplication([
(r'/xml/(.*)', XmlCrud),
], debug=True)
wsgiref.handlers.CGIHandler().run(application)
if __name__ == '__main__':
main()
Silverlight:
private class RequestExtended
{
public VoidCall CallBack;
public WebRequest Request;
public Uri Host;
public RequestExtended(WebRequest request, VoidCall callBack, Uri host)
{
Request = request;
CallBack = callBack;
Host = host;
}
}
public static void ImportFromGoogle(Uri host, VoidCall callBack)
{
try
{
if (host.Host == "localhost")
{
host = new Uri(host.Scheme + @"://" + host.Host + ":8080");
}
var bossesCrud = new Uri(host, "/xml/bosses");
var bossesRequest = WebRequest.Create(bossesCrud);
bossesRequest.BeginGetResponse(BossesResponse, new RequestExtended(bossesRequest, callBack, host));
}
catch (Exception ex)
{
}
}
public static void BossesResponse(IAsyncResult result)
{
var requestExtended = result.AsyncState as RequestExtended;
try
{
WebResponse response = requestExtended.Request.EndGetResponse(result);
Stream responseStream = response.GetResponseStream();
byte[] bytes = new byte[response.ContentLength];
responseStream.Read(bytes, 0, bytes.Length);
responseStream.Close();
var enc = new System.Text.UTF8Encoding();
string xml = enc.GetString(bytes, 0, bytes.Length);
bosses = GetCollectionFromXmlString<BossCollection>(xml);
if (requestExtended.CallBack != null) requestExtended.CallBack();
}
catch (WebException we)
{
HttpWebResponse response = (HttpWebResponse)we.Response;
response.Close();
}
catch (Exception e)
{
}
}
public static void SaveBossesToGoogle(Uri host)
{
if (host.Host == "localhost")
{
host = new Uri(host.Scheme + @"://" + host.Host + ":8080");
}
var bossesCrud = new Uri(host, "/xml/bosses");
var request = WebRequest.Create(bossesCrud);
request.Method = "POST";
request.ContentType = "text/xml"; //"application/x-www-form-urlencoded";
request.BeginGetRequestStream(GetSaveBossesRequestStreamCallback, new RequestExtended(request, null, host));
}
static void GetSaveBossesRequestStreamCallback(IAsyncResult result)
{
var requestExtended = result.AsyncState as RequestExtended;
try
{
Stream stream = requestExtended.Request.EndGetRequestStream(result);
var xmlSerializer = new XmlSerializer(typeof(BossCollection));
var xmlText = new StringBuilder();
using (TextWriter textWriter = new StringWriter(xmlText))
{
xmlSerializer.Serialize(textWriter, Store.Bosses);
textWriter.Close();
}
var enc = new System.Text.UTF8Encoding();
var bytes = enc.GetBytes(xmlText.ToString());
stream.Write(bytes, 0, bytes.Length);
stream.Close();
requestExtended.Request.BeginGetResponse(SaveResponse, requestExtended);
}
catch (WebException we)
{
HttpWebResponse response = (HttpWebResponse)we.Response;
response.Close();
}
}
static void SaveResponse(IAsyncResult result)
{
var requestExtended = result.AsyncState as RequestExtended;
try
{
WebResponse response = requestExtended.Request.EndGetResponse(result);
if (requestExtended.CallBack != null) requestExtended.CallBack();
}
catch (WebException we)
{
HttpWebResponse response = (HttpWebResponse)we.Response;
response.Close();
}
}
Tôi không thể tìm thấy bất kỳ ví dụ nào về việc sử dụng Silverlight để làm việc với SDK Java của ứng dụng Google, do đó, here is my post.
Tôi không nghĩ API Bling có nhiều điểm chung với GAE –