2010-04-23 110 views
0

我想我在使用C#客戶端使用Google App Engine Webservice時遇到了問題。我使用Google App Engine代碼is here。這是如何在服務器上的python腳本會是什麼樣子:C#客戶端使用Google App Engine RESTful Webservice(rpc XML)

from google.appengine.ext import webapp           
from google.appengine.ext.webapp.util import run_wsgi_app      
import logging                 

from StringIO import StringIO             
import traceback 
import xmlrpclib 
from xmlrpcserver import XmlRpcServer 

class Application: 
    def __init__(self): 
     pass      

    def getName(self,meta):              
     return 'example' 

class XMLRpcHandler(webapp.RequestHandler):          
    rpcserver = None 

    def __init__(self):   
     self.rpcserver = XmlRpcServer()           
     app = Application()              
     self.rpcserver.register_class('app',app)        

    def post(self): 
     request = StringIO(self.request.body) 
     request.seek(0)               
     response = StringIO()             
     try: 
      self.rpcserver.execute(request, response, None)      
     except Exception, e:             
      logging.error('Error executing: '+str(e))       
      for line in traceback.format_exc().split('\n'):      
       logging.error(line) 
     finally: 
      response.seek(0) 

     rstr = response.read()             
     self.response.headers['Content-type'] = 'text/xml'      
     self.response.headers['Content-length'] = "%d"%len(rstr)    
     self.response.out.write(rstr) 

application = webapp.WSGIApplication(           
            [('/xmlrpc/', XMLRpcHandler)], 
            debug=True)        
def main(): 
    run_wsgi_app(application)              

if __name__ == "__main__": 
    main() 

的客戶端(在Python)是這樣的:

import xmlrpclib 
s = xmlrpclib.Server('http://localhost:8080/xmlrpc/') 
print s.app.getName() 

我有使用Python客戶端檢索從谷歌應用程序的值沒有問題引擎,但我在使用C#客戶端檢索值時遇到困難。當我嘗試從網絡請求中輸入GetResponse時,我收到的錯誤是404 method not found

這是我的代碼

 var request = (HttpWebRequest)WebRequest.Create("http://localhost:8080/xmlrpc/app"); 

     request.Method = "GET"; 
     request.ContentLength = 0; 
     request.ContentType = "text/xml"; 
     using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) //404 method not found error here. 
     { 

     } 

編輯:對於終點,我已經試過:

  1. http://localhost:8080/xmlrpc
  2. http://localhost:8080/xmlrpc/
  3. http://localhost:8080/xmlrpc/app
  4. http://localhost:8080/xmlrpc/app/

但是沒有作品

我認爲這一定是該網址是錯誤的,但我不知道如何把它正確。任何想法?

回答

1

我想會發生什麼是您使用HttpWebRequest發送的請求缺少實際內容;這應該是xml格式的rpc方法信息。請檢查下面的代碼是否適用於您;它應該發送請求到http://localhost:8080/xmlrpc/並將生成的xml轉儲到控制檯中。

// send request 
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost:8080/xmlrpc/"); 
request.Method = "POST"; 
request.ContentType = "text/xml; encoding=utf-8"; 

string content = "<?xml version='1.0'?><methodCall><methodName>app.getName</methodName><params></params></methodCall>"; 
byte[] contentBytes = System.Text.UTF8Encoding.UTF8.GetBytes(content);      
request.ContentLength = contentBytes.Length; 
using (Stream stream = request.GetRequestStream()) 
{ 
    stream.Write(contentBytes, 0, contentBytes.Length); 
} 

// get response 
WebResponse response = request.GetResponse(); 
XmlDocument xmlDoc = new XmlDocument(); 
using (Stream responseStream = response.GetResponseStream()) 
{ 
    xmlDoc.Load(responseStream); 
    Console.WriteLine(xmlDoc.OuterXml); 
}  

希望這會有所幫助,至於

+0

您的回答有效!謝謝。我可以知道哪裏可以找到更多關於此的參考? – Graviton 2010-04-26 06:22:42

+0

我想讀一下他們的工作方式可能會有所幫助。你也可以使用Wireshark這樣的嗅探器工具來查看當你使用更高級別的apis與服務器進行通信時,通過http \ tcp發送和接收的內容 – 2010-04-26 12:49:48

0

您的App Engine應用程序中端點的正則表達式正好是'/ xmlrpc /',這是您在Python測試中使用的,但是在您使用'/ xmlrpc/app'的C#客戶端中沒有映射到任何東西。

+0

@尼克,我已經嘗試了所有我可以想到的端點組合(請參閱更新後的問題),但仍然無法工作。 – Graviton 2010-04-23 11:15:17

+0

那麼App Engine應用程序的日誌顯示傳入請求的內容是什麼?你會知道它實際使用的端點。 – 2010-04-23 16:24:17

1

除了出色的答案貼here,還可以使用xml-rpc.net做的工作。

下面是在服務器端的代碼,假設現在的getName需要一個string參數:

def getName(self,meta, keyInput):              
    return keyInput 

,這將是C#的客戶端代碼,通過利用xml-rpc.net的:

[XmlRpcUrl("http://localhost:8080/xmlrpc")] 
public interface IMath : IXmlRpcProxy 
{ 
    [XmlRpcMethod("app.getName")] 
    string GetName(string number); 

} 

public string GetName(string keyInput) 
{ 
     var mathProxy = XmlRpcProxyGen.Create<IMath>(); 
     mathProxy.Url = "http://localhost:8080/xmlrpc/"; 
     return mathProxy.GetName(keyInput); 

} 

希望這可以幫助每個人努力從C#客戶端進行rcc調用GAE。

相關問題