本文介绍了Silverlight上的Google App Engine的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有没有关于如何从Silverlight使用Google App Engine的很好的例子,最好不用编写自定义的webservices?

are there any good examples on how to use Google App Engine from Silverlight, preferably without writing custom webservices?

干杯

Nik

推荐答案

这是我的方法,主要基于
简单地传递XML,.xap也是由GAE提供的。

Here is my approach based heavily on Scott Seely's postSimply passes XML around, .xap is also served by GAE. I only just got this working yesterday so it is still work in progress.

Google:

app.yaml

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

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();
    }
}

这篇关于Silverlight上的Google App Engine的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-29 19:31