PDA

View Full Version : مشکل در XML RPC - Client



narsic
پنج شنبه 18 اسفند 1390, 13:46 عصر
دوستان من در کار با یک XML RPC server مشکل دارم البته در نمایش مقدار های بازگشتی XML نمونه ایی که این سرور بر میگردونه به شکل زیر هستش:
Server**UnReg**P/0.3 Python/2.7.2
Date: Thu, 08 Mar 2012 09:21:12 GMT
Content-type: text/xml
Content-length: 2952

<?xml version='1.0'?>
<methodResponse>
<params>
<param>
<value><struct>
<member>
<name>1</name>
<value><struct>
<member>
<name>online_status</name>
<value><boolean>0</boolean></value>
</member>
<member>
<name>user_repr</name>
<value><string>test_user</string></value>
</member>
<member>
<name>attrs</name>
<value><struct>
<member>
<name>comment</name>
<value><string>طھط³طھ</string></value>
</member>
<member>
<name>real_first_login</name>
<value><string>2008-12-04 16:18</string></value>
</member>
<member>
<name>limit_mac</name>
<value><string>00:23:8B:B6:64:FD</string></value>
</member>
<member>
<name>normal_password</name>
<value><string>password_foobar123</string></value>
</member>
<member>
<name>limit_station_ip_bind_on_login</name>
<value><string></string></value>
</member>
<member>
<name>limit_mac_bind_on_login</name>
<value><string></string></value>
</member>
<member>
<name>limit_caller_id_bind_on_login</name>
<value><string></string></value>
</member>
<member>
<name>allow_recharge_by_voucher</name>
<value><string></string></value>
</member>
<member>
<name>normal_username</name>
<value><string>test_user</string></value>
</member>
<member>
<name>user_id</name>
<value><int>1</int></value>
</member>
<member>
<name>name</name>
<value><string>طھط³طھ</string></value>
</member>
<member>
<name>is_deposit_transferer</name>
<
البته این قسمتی از کدش هست (بقیش هم شبیه همینه)
من برای کار باهاش یک Structure نوشتم اما مشکلی که دارم با قسمت های اولیشه
این قسمت:
<methodResponse>
<params>
<param>
<value><struct>
<member>
<name>1</name>
عدد 1 در حقیقت ID هست، و برای هر کاربر عوض میشه.
حالا دوستان برای این مشکل چه پیشنهادی دارید؟

narsic
سه شنبه 23 اسفند 1390, 21:40 عصر
فایل XML کامل

<?xml version='1.0'?>
<methodResponse>
<params>
<param>
<value>
<struct>
<member>
<name>632</name>
<value>
<struct>
<member>
<name>online_status</name>
<value>
<boolean>1</boolean>
</value>
</member>
<member>
<name>user_repr</name>
<value>
<string>*****</string>
</value>
</member>
<member>
<name>attrs</name>
<value>
<struct>
<member>
<name>normal_password</name>
<value>
<string>NORMAL-PASSWORD</string>
</value>
</member>
<member>
<name>normal_username</name>
<value>
<string>******</string>
</value>
</member>
<member>
<name>user_id</name>
<value>
<int>632</int>
</value>
</member>
</struct>
</value>
</member>
<member>
<name>basic_info</name>
<value>
<struct>
<member>
<name>status</name>
<value>
<string>Package</string>
</value>
</member>
<member>
<name>user_id</name>
<value>
<int>632</int>
</value>
</member>
<member>
<name>creation_date</name>
<value>
<string>2011-07-24 14:43</string>
</value>
</member>
<member>
<name>group_name</name>
<value>
<string>amoozesh-st</string>
</value>
</member>
<member>
<name>credit</name>
<value>
<double>1.0</double>
</value>
</member>
<member>
<name>deposit</name>
<value>
<double>0.0</double>
</value>
</member>
<member>
<name>isp_id</name>
<value>
<int>1</int>
</value>
</member>
<member>
<name>isp_name</name>
<value>
<string>Am**UnReg</string>
</value>
</member>
<member>
<name>group_id</name>
<value>
<int>52</int>
</value>
</member>
</struct>
</value>
</member>
</struct>
</value>
</member>
</struct>
</value>
</param>
</params>
</methodResponse>

البته این XML با قبلی فرق میکنه (یه تابع دیگه ایی)
توی این جواب هم مقدار 632 هر بار تغییر میکنه (معادل User Id) و بزرگترین مشکل خودم هم با همین بخشش هست

mehdi.mousavi
چهارشنبه 24 اسفند 1390, 13:16 عصر
سلام.
برای انجام اینکار، میتونید بدین شکل عمل کنید:


XDocument doc = XDocument.Load("d:\\temp.xml");

IEnumerable<XElement> names = doc.XPathSelectElements("//methodResponse/params/param/value/struct/member/name");
foreach (XElement name in names)
{
string memberName = name.Value; //632

IEnumerable<XElement> members = name.Parent.XPathSelectElements("value/struct/member/name");
IEnumerable<XElement> attribNames = members.Where(el => el.Value == "attrs").SingleOrDefault().XPathSelectElements("../value/struct/member/name");
IEnumerable<XElement> basicAttribs = members.Where(el => el.Value == "basic_info").SingleOrDefault().XPathSelectElements("../value/struct/member/name");

var res = new
{
IsOnline = members.Where(el => el.Value == "online_status").SingleOrDefault().XPathSelectElement("../value/boolean").Value != "0",
UserRepr = members.Where(el => el.Value == "user_repr").SingleOrDefault().XPathSelectElement("../value/string").Value,

NormalPassword = attribNames.Where(el => el.Value == "normal_password").SingleOrDefault().XPathSelectElement("../value/string").Value,
NormalUsername = attribNames.Where(el => el.Value == "normal_username").SingleOrDefault().XPathSelectElement("../value/string").Value,
UserId = int.Parse(attribNames.Where(el => el.Value == "user_id").SingleOrDefault().XPathSelectElement("../value/int").Value),

Status = basicAttribs.Where(el => el.Value == "status").SingleOrDefault().XPathSelectElement("../value/string").Value,
CreationDate = DateTime.Parse(basicAttribs.Where(el => el.Value == "creation_date").SingleOrDefault().XPathSelectElement("../value/string").Value)
};
}


که در اون فرض کردم XML در فایلی در دایرکتوری ی d:\\ تحت نام temp.xml ذخیره شده. اگر با بخشی از کد مشکل دارید و متوجه نشدید بفرمایید تا توضیح بدم. در هر حال، کد فوق اطلاعات رو از XML میخونه، و اونها رو تحت Anonymous Object ای به اسم res نگه میداره....

موفق باشید.

narsic
چهارشنبه 24 اسفند 1390, 14:02 عصر
من با فایل روی این کار نمیکنم این اطلاعات رو از وب سرویس میخونم از یک وب سرویس XML RPC و همونجور که گفتم نمیدونم اون قسمت User Id رو چه جوری حل کنم
وب سرویس با Python نوشته شده و همون طور که در XML بالا میببینید user Id که اینجا ۶۳۲ هست به عنوان در برگیرنده تمام عناصر استفاده شده من نمیدونم چه جوری به سیستم بگم که اطلاعات این قسمت رو بگیر و من تا اینجای کار رو از طریق نوشتن یک Structure انجام دادم.
اگه نیاره تا کد هایی که نوشتم رو بزرام؟

mehdi.mousavi
چهارشنبه 24 اسفند 1390, 16:22 عصر
سلام.


من با فایل روی این کار نمیکنم این اطلاعات رو از وب سرویس میخونم از یک وب سرویس XML RPC و همونجور که گفتم نمیدونم اون قسمت User Id رو چه جوری حل کنم
شما چطوری با این XML RPC Service کار می کنید؟ منظورم اینه که Client شما، چطوری و بر اساس چه مکانیزمی اطلاعات مورد نظر رو از Web Service میگیره؟ آیا از XML-RPC .NET (http://www.xml-rpc.net/) استفاده کرده اید؟


وب سرویس با Python نوشته شده و همون طور که در XML بالا میببینید user Id که اینجا ۶۳۲ هست به عنوان در برگیرنده تمام عناصر استفاده شده من نمیدونم چه جوری به سیستم بگم که اطلاعات این قسمت رو بگیر و من تا اینجای کار رو از طریق نوشتن یک Structure انجام دادم. اگه نیاره تا کد هایی که نوشتم رو بزرام؟

بله، اگر کدها رو بذارید ببینم، متوجه میشم که چطوری دارید با اون سرویس ارتباط برقرار می کنید. چون بطور کلی، نوشتن XML-RPC Client/Server ساز و کاری داره (مثل SOAP) و باید بر اساس اون ساز و کارها Client و Server با هم ارتباط برقرار کنن.

موفق باشید.

narsic
چهارشنبه 24 اسفند 1390, 21:54 عصر
این کدها برای فراخوانی همون نتیجه بالا هستن (XML پست قبلی از این تابع بدست اومده)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using CookComputing.XmlRpc;
using System.Data;


[WebService(Namespace = "192.168.10.76")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

public class Service : System.Web.Services.WebService {
private XmlRpcStruct _arguments;
public Service() {

this._arguments = new XmlRpcStruct();
this._arguments.Add("auth_name", "system");// Web Service User Name
this._arguments.Add("auth_pass", "sys");// Web Service User Pass
this._arguments.Add("auth_type", "ADMIN");// Web Service User Type
}

[WebMethod]
public bool CheckUser(string username, string password) {
try {
Isend_recv proxy = (Isend_recv)XmlRpcProxyGen.Create(typeof(Isend_rec v));
XmlRpcStruct arguments = this._arguments;// Create new arguments connection
arguments.Add("login_auth_type", "NORMAL_USER");
arguments.Add("login_auth_name", username);
arguments.Add("login_auth_pass", password);
return proxy.login(arguments);
}
catch (Exception ex) {
return false;
}
}

[WebMethod]
public UserInfo getUserInfoByUserId(string userid)
{
try
{

Isend_recv proxy = (Isend_recv)XmlRpcProxyGen.Create(typeof(Isend_rec v));
XmlRpcStruct arguments = this._arguments;// Create new arguments connection
arguments.Add("user_id", userid);
UserInfo ret = proxy.getUserInfo(arguments);
return (ret);

}
catch (Exception ex)
{
throw ex;
}
}
}

[XmlRpcUrl("http://192.168.10.76:1235/")]
public interface Isend_recv : IXmlRpcProxy {
[XmlRpcMethod("user.getUserInfo")]
UserInfo getUserInfo(XmlRpcStruct arguments);
[XmlRpcMethod("login.login")]
bool login(XmlRpcStruct arguments);
}

[XmlRpcMissingMapping(MappingAction.Ignore)]
public struct UserInfo
{
public bool online_status;
public string user_repr;
public UserInfoAttrs attrs;

}

[XmlRpcMissingMapping(MappingAction.Ignore)]
public struct UserInfoAttrs
{
public string normal_password;
public string normal_username;
public int user_id;
public string real_first_login;
}