ارسال توکن امنیتی به سمت سرور

سلام

برنامه ای که من دارم روی اون کار میکنم سی شارپ تحت ویندوز هست که میخواد با سرور لوکال که روی سیستم خودم هست ارتباط برقرار کنه.
سرور لوکال من ترکیبی از PHP , MySQL , XAMPP هست.
ارسال درخواست از برنامه به سرور بکمک کلاس HttpWebRequest انجام میشه و کوکی را دریافت میکنم.

مشکل اول هم اینه که چه جوری security token را از سرور بگیرم.

مشکل دوم اینه که میخوام request بفرستم سرور پیغام No Security Token میده. حالا من موندم چه جوری توکن امنیتی را همراه درخواست به سمت سرور بفرستم.

هر چی توی اینترنت میگردم چیز بدردبخوری پیدا نمیکنم.

ممنون از راهنماییتون
 
آخرین ویرایش:

the_king

مدیرکل انجمن
سلام

برنامه ای که من دارم روی اون کار میکنم سی شارپ تحت ویندوز هست که میخواد با سرور لوکال که روی سیستم خودم هست ارتباط برقرار کنه.
سرور لوکال من ترکیبی از PHP , MySQL , XAMPP هست.
ارسال درخواست از برنامه به سرور بکمک کلاس HttpWebRequest انجام میشه و کوکی را دریافت میکنم.

مشکل اول هم اینه که چه جوری security token را از سرور بگیرم.

مشکل دوم اینه که میخوام request بفرستم سرور پیغام No Security Token میده. حالا من موندم چه جوری توکن امنیتی را همراه درخواست به سمت سرور بفرستم.

هر چی توی اینترنت میگردم چیز بدردبخوری پیدا نمیکنم.

ممنون از راهنماییتون
راه حل تون بستگی به موردی داره که باهاش ارتباط برقرار می کنید، Security Token هر سیستمی فرق می کنه، هم اسمش، هم نحوه دریافت اش و هم ارسال اش.
یک جواب مشخص نداره که با هر سیستمی که ارتباط برقرار کردید همون شیوه جواب بده.
الان همین فروم مجید آنلاین که سیستم vBulletin داره هم Security Token داره. یک متغیر ئه به اسم securitytoken، موقع لاگین کردن با securitytoken ئه guest وارد فروم می شوید و در
پاسخ مقدار securitytoken رو که یک رشته طولانی ئه دریافت می کنید. از اون به بعد با هر عملیاتی که انجام می دهید باید متغیر securitytoken با متد POST به سیستم ارسال بشه.
 
ممنون از جوابتون.

سرور لوکال بر اساس PhpFox طراحی شده.

من پاسخ سرور را بکمک کلاس HttpWebResponse دریافت میکنم نمیدونم چه جوری از این کلاس توکن را get کنم و اینکه میدونم باید بصورت post بفرستم اما توکن را توی url بذارم یا اینکه جزو WebRequest Header باشد؟
 
مشکل حل شد. برای گرفتن توکن باید درخواست میدادم تا توکن را برام بفرسته.

اما یه مشکل دیگه : من میخوام دیتا از سرور بگیرم که از نوع json هست و فیلدهاش ترکیبی از join چند جدول هستش و پیدا کردن جداول هم به این راحتی نیست. ظاهرا توی دات نت هم باید نوع ابجکت مشخص باشه تا از حالت json خارج باشه. راهی هست که من بتونم بدون اینکه type را تعیین کنم json را deserialize کنم؟
 

the_king

مدیرکل انجمن
مشکل حل شد. برای گرفتن توکن باید درخواست میدادم تا توکن را برام بفرسته.

اما یه مشکل دیگه : من میخوام دیتا از سرور بگیرم که از نوع json هست و فیلدهاش ترکیبی از join چند جدول هستش و پیدا کردن جداول هم به این راحتی نیست. ظاهرا توی دات نت هم باید نوع ابجکت مشخص باشه تا از حالت json خارج باشه. راهی هست که من بتونم بدون اینکه type را تعیین کنم json را deserialize کنم؟
درسته که اون متد Deserialize ازتون نوع داده می خواد ولی فقط یک type خاص نیست، مستقل از اینکه نوع داده اصلی چی باشه می توانید فیلد ها و مقادیر رو بصورت <Dictionary<string, string تحویل بگیرید.

کد:
var dic = x.Deserialize<Dictionary<string, string>>(input);

کد:
            var s = new StringBuilder();
            foreach (var item in dic)
            {
                s.AppendFormat("{0}={1}\n", item.Key, item.Value);
            }

کد:
var value = dic["FieldName"].ToString();
 
ممنون از جوابتون. ظاهرا کلاهمون با این json داره توی هم میره!
من چیزی که شما گفتید را اجرا کردم بصورت زیر:

کد:
static void Main(string[] args)[/LEFT]
        {
            StreamReader sr = new StreamReader(@"D:\comments.txt");
            string json = sr.ReadToEnd();
            DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Dictionary<string, string>));
            using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(json)))
            {
                ms.Position = 0;
                Dictionary<string, string> obj = serializer.ReadObject(ms) as Dictionary<string, string>;
                ReadArray(obj);
            }
            Console.ReadKey();
        }
        static void ReadArray(Dictionary<string, string> arr)
        {
            foreach (var a in arr)
                Console.Write(a.Key + " : " + a.Value);
[LEFT]        }
اما ارور زیر را به من میده:

Error Serialization Exception : The data contact type 'System.Runtime.Serialization.KeyValue'2[[System.String,mscorlib​
روی خطی که دارم ReadObject انجام میدم.
 

the_king

مدیرکل انجمن
مشکل حل شد. برای گرفتن توکن باید درخواست میدادم تا توکن را برام بفرسته.

اما یه مشکل دیگه : من میخوام دیتا از سرور بگیرم که از نوع json هست و فیلدهاش ترکیبی از join چند جدول هستش و پیدا کردن جداول هم به این راحتی نیست. ظاهرا توی دات نت هم باید نوع ابجکت مشخص باشه تا از حالت json خارج باشه. راهی هست که من بتونم بدون اینکه type را تعیین کنم json را deserialize کنم؟

ممنون از جوابتون. ظاهرا کلاهمون با این json داره توی هم میره!
من چیزی که شما گفتید را اجرا کردم بصورت زیر:

کد:
static void Main(string[] args)[/LEFT]
        {
            StreamReader sr = new StreamReader(@"D:\comments.txt");
            string json = sr.ReadToEnd();
            DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Dictionary<string, string>));
            using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(json)))
            {
                ms.Position = 0;
                Dictionary<string, string> obj = serializer.ReadObject(ms) as Dictionary<string, string>;
                ReadArray(obj);
            }
            Console.ReadKey();
        }
        static void ReadArray(Dictionary<string, string> arr)
        {
            foreach (var a in arr)
                Console.Write(a.Key + " : " + a.Value);
[LEFT]        }
اما ارور زیر را به من میده:

Error Serialization Exception : The data contact type 'System.Runtime.Serialization.KeyValue'2[[System.String,mscorlib​
روی خطی که دارم ReadObject انجام میدم.
شما از من پرسیدید که چطور json رو Deserialize کنید و بعد کد Serialize می نویسید؟ اگه ورودی شما json ئه پس خودش Serialize شده، با Serializer ئه Json می خواهید چه کار جدیدی انجام بشه؟
 

the_king

مدیرکل انجمن
اشتباه نشه. من دارم یه json از سرور میگیرم که میخوام اونو deserialize کنم. این مشکل منه.

بله، متوجه شدم، برای همین تعجب کردم که چرا از DataContractJsonSerializer استفاده می کنید.
در منوی Project با Add Reference به پروژه تون System.Web.Extensions رو اضافه کنید.
کد:
using System.Web.Script.Serialization;
using System.IO;

[COLOR="#D3D3D3"]namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {[/COLOR]
            string json = File.ReadAllText(@"D:\comments.txt");
            var serializer = new JavaScriptSerializer();
            var dic = serializer.Deserialize<Dictionary<string, [B][COLOR="#0000FF"]object[/COLOR][/B]>>(json);
            ReadArray(dic);
            Console.ReadKey();
        }

        static void ReadArray(Dictionary<string, [B][COLOR="#0000FF"]object[/COLOR][/B]> arr)
        {
            foreach (var a in arr)
            {
                if (a.Value is string)
                {
                    Console.WriteLine(a.Key + " : " + a.Value.ToString());
                }
                else if (a.Value is System.Collections.ArrayList)
                {
                    Console.Write(a.Key + " : ");
                    var list = (System.Collections.ArrayList)a.Value;
                    foreach (var obj in list)
                        Console.Write(obj.ToString() + " ");
                    Console.WriteLine();
                }
                else
                {
                    Console.WriteLine(a.Key + ": {");
                    ReadArray((Dictionary<string, [B][COLOR="#0000FF"]object[/COLOR][/B]>)a.Value);
                    Console.WriteLine("}");
                }
            }
 
ممنون از کمکتون اما ارور میده:
23806146380453432875_1.PNG
 

the_king

مدیرکل انجمن
بفرمایید این هم فایل comments.txt : از اینجا دانلود کنید

چون دو مورد (لیست) بود با خطا مواجه می شد. باید از <<List<Dictionary<string, object استفاده کنید.

کد:
        {
            string json = File.ReadAllText(@"D:\comments2.txt");
            var serializer = new JavaScriptSerializer();
            var list = serializer.Deserialize<List<Dictionary<string, object>>>(json);
            ReadArray(list);
            Console.ReadKey();
        }

        static void ReadArray(Dictionary<string, object> dic)
        {
            if (dic == null)
            {
                Console.WriteLine("null");
                return;
            }
            foreach (var item in dic)
            {
                if (item.Value == null)
                {
                    Console.WriteLine(item.Key + " : null");
                }
                else if (item.Value is Dictionary<string, object>)
                {
                    ReadArray((Dictionary<string, object>)item.Value);
                }
                else if (item.Value is System.Collections.ArrayList)
                {
                    Console.Write(item.Key + "[] : ");
                    var arr = (System.Collections.ArrayList)item.Value;
                    if (arr.Count == 0)
                    {
                        Console.Write("empty");
                    }
                    else
                    {
                        Console.Write("{");
                        Console.Write(arr[0].ToString());
                        for (int i = 1; i < arr.Count; i++)
                            Console.Write(", " + arr[i].ToString());
                        Console.Write("}");
                    }
                    Console.WriteLine();
                }
                else
                {
                    Console.WriteLine(item.Key + " : " + item.Value.ToString());
                }
            }

        }

        static void ReadArray(List<Dictionary<string, object>> list)
        {
            if (list == null)
            {
                Console.WriteLine("null");
                return;
            }
            foreach (var item in list)
            {
                ReadArray(item);
            }
        }
 

جدیدترین ارسال ها

بالا