Google App Engine on Silverlight

前端 未结 5 1277
执念已碎
执念已碎 2021-02-09 06:50

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

Cheers

Nik

5条回答
  •  北荒
    北荒 (楼主)
    2021-02-09 07:16

    Here is my approach based heavily on Scott Seely's post Simply 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

        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="Bosses go here")
      Xml.get_or_insert("Dungeons", xmlContent="Dungeons go here")
      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(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();
        }
    }
    

提交回复
热议问题