PDA

View Full Version : نحوه استفاده از یه وب سرویس ارسال پیامک ؟؟



aidin2345
شنبه 09 فروردین 1399, 11:06 صبح
با سلام
دوستان یه کمک میخواستم در مورد اینکه از یه وب سرویس ارسال پیامک که لیست پیامهایی که به شماره اختصاصی فرستاده شدن رو توی گرید ویووو بتونم نمایش بدم و در نهایت تاریخی که در Result داده رو تبدیل کنه به تاریخ دریافت پیام



اینم راهنمای سایته

برای استفاده از تمامی سرویس ها ، شما می بایست در فیلد Authorization ، متعلق به هدر درخواست ) RequestHeader )رشته ای را که به فرم زیر محاسبه می گردد قرار دهید .- نام کاربری و رمز خود را به شکل زیر درون یک متغییر بریزید .
string Auth = username + ":" + password

- خروجی را توسط الگوریتم Base64 کد گذاری کنید .
string encodedAuth = encode with Base46

- در این مرحله ، به ابتدای خروجی مرحله قبل رشته ی " Basic " را به فرم زیر قرار دهید .
string authHeader = "Basic " + encodedAuth

- در نهایت رشته ی به دست آمده را در فیلد Authorization متعلق به هدر درخواست ) Request Header ) قرار دهید .
رشته مورد نظر می بایست در هدر تمامی در خواست ها ارسال گردد .


از این متد برای واکشی ، لیست پیام های در یافتی استفاده می شود .
URL : https://www.xxxxxxxxx.com/api/smsAPI/ReceiveMessages
Method : POST

پارامتر های ورودی
نام پارامتر نوع پارامتر توضیحات
PhoneNumber string شماره اختصاصی
StartDate long تاریخ شروع به صورت TimeStamp
EndDate long تاریخ شروع به صورت TimeStamp
Page Int شماره صفحه



پارامتر های خروجی
نام پارامتر نوع پارامتر توضیحات
Code Int کد پیام دریافتی
Message string متن پیام دریافتی
Result JSON Object در صورت عدم خطا پارامتر های زیر را فراهم میکند


Result
نام پارامتر نوع پارامتر توضیحات
Page Int شماره صفحه
TotalPage Int تعداد کل صفحات
ReceivedMsgs JSON Object در صورت عدم خطا پارامتر های زیر را فراهم میکند



ReceivedMsgs
نام پارامتر نوع پارامتر توضیحات
MsgBody string متن پیام دریافتی
Mobile string موبایل ارسال کننده پیام
Date JSON Object تاریخ دریافت پیامک به صورت TimeStamp


نمونه پارامترهای ارسالی
{
"PhoneNumber": "98300085552000111",
"StartDate":1537701000 ,
"EndDate":1537701659 ,
"Page": 1
}

نمونه پارامترهای خروجی
{
"Code": 0,

"Message": " است شده انجام موفقیت با عملیات ",
"Result":[{"Page":1,"TotalPage":"20","ReceivedMsgs":[{"MsgBody":"متن پیام " , "Mobile ":"موبایل " , "Date":1537701658 }]}]

taghvajou
شنبه 09 فروردین 1399, 17:16 عصر
سلام
اولش گفتین که میخواین فلان کار رو بکنین .
خب آخرش نگفتین دقیقا سوال الان چیه؟

aidin2345
چهارشنبه 13 فروردین 1399, 19:21 عصر
سلام
اولش گفتین که میخواین فلان کار رو بکنین .
خب آخرش نگفتین دقیقا سوال الان چیه؟

سلام
اولش گفتم که - لیست پیامهایی که به شماره اختصاصی فرستاده شدن رو توی گرید ویووو بتونم نمایش بدم
به قولی با استفاده از اون الگو و نمونه ها کد رو بنویسم که چک کنه و پیام ها رو با استفاده از

PhoneNumber string شماره اختصاصی
StartDate long تاریخ شروع به صورت TimeStamp
EndDate long تاریخ شروع به صورت TimeStamp
Page Int شماره صفحه

the king
پنج شنبه 14 فروردین 1399, 03:06 صبح
با سلام
دوستان یه کمک میخواستم در مورد اینکه از یه وب سرویس ارسال پیامک که لیست پیامهایی که به شماره اختصاصی فرستاده شدن رو توی گرید ویووو بتونم نمایش بدم و در نهایت تاریخی که در Result داده رو تبدیل کنه به تاریخ دریافت پیام


دو تا کار باید انجام بشه، اولی ارسال درخواست و دریافت پاسخ ئه و دومی تفسیر JSON پاسخ.
برای اینکه DataContractJsonSerializer بتونه JSON رو بخونه کلاس های مرتبط رو تعریف می کنیم :

کلاس اصلی که JSON میخونه :

[DataContract]
private class PageData
{
[DataMember]
public int Code { get; set; }

[DataMember]
public string Message { get; set; }

[DataMember]
public ResultData[] Result { get; set; }
}


و محتویات اون کلاس :

[DataContract]
private class ResultData
{
[DataMember]
public int Page { get; set; }

[DataMember]
public int TotalPage { get; set; }

[DataMember]
public MessageData[] ReceivedMsgs { get; set; }
}

[DataContract]
private class MessageData
{
[DataMember]
public string MsgBody { get; set; }

[DataMember]
public string Mobile { get; set; }

[DataMember]
public long Date { get; set; }
}


و یک کلاس ایجاد می کنیم که همه عملیات رو از داخلش انجام بده :

public class SmsProvider
{
public SmsProvider(string username, string password);

public DataTable GetMessages(string phoneNumber, string url, DateTime startDate, DateTime endDate);
}


در نهایت ابتدا یک شیء از SmsProvider با نام کاربری و رمز عبور مورد نظر ایجاد می کنیم و بعد با GetMessages درون یک جدول DataTable پیام ها رو دریافت می کنیم.
در متد سازنده کلاس authHeader_ رو که در درخواست ها درون Authorization ثبت میشه مقدار دهی می کنیم :

private readonly string _authHeader;

public SmsProvider(string username, string password)
{
var auth = username + ":" + password;
var encodedAuth = Convert.ToBase64String(Encoding.UTF8.GetBytes(auth ));
_authHeader = "Basic " + encodedAuth;
}


و دو تا متد می سازیم که بین DateTime و Timestamp تبدیل داده رو انجام بده :

private static long GetUnixTimestamp(DateTime dateTime)
{
var epoch = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
return (long)TimeZoneInfo.ConvertTimeToUtc(dateTime).Subt ract(epoch).TotalSeconds;
}

private static DateTime GetDateTime(long timestamp)
{
var epoch = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
return epoch.AddSeconds(timestamp);
}


و GetMessage رو طوری کد نویسی می کنیم که اول یک DataTable بسازه، ستون هاش رو ایجاد کنه و صفحه اول رو دریافت کنه و پیام هاش رو در DataTable درج کنه و بعد اگر تعداد کل صفحات بیشتر از 1 بود صفحات بعدی رو هم دریافت کنه. این متد به متد GetPage وابسته است که باید یک صفحه رو دریافت کنه و بعد با متد DecodePage هم JSON رو تفسیر کنه.

public DataTable GetMessages(string phoneNumber, string url, DateTime startDate, DateTime endDate)
{
var dt = new DataTable();
dt.Columns.Add("Date", typeof(DateTime));
dt.Columns.Add("Mobile");
dt.Columns.Add("MsgBody");
var bytes = GetPage(phoneNumber, url, startDate, endDate, 1);
var totalPage = DecodePage(bytes, dt);
for (var i = 2; i <= totalPage; i++)
{
bytes = GetPage(phoneNumber, url, startDate, endDate, i);
DecodePage(bytes, dt);
}
return dt;
}


در متد GetPage یک صفحه رو دریافت می کنیم، چیزی که دریافت میشه آرایه ای از بایت ها است که قاعدتا رشته در سیستم UTF8 خواهد بود :

private byte[] GetPage(string phoneNumber, string url, DateTime startDate, DateTime endDate, int page)
{
using (var client = new WebClient())
{
client.Headers[HttpRequestHeader.Authorization] = _authHeader;
var values = new NameValueCollection
{
["PhoneNumber"] = phoneNumber,
["StartDate"] = GetUnixTimestamp(startDate).ToString(),
["EndDate"] = GetUnixTimestamp(endDate).ToString(),
["Page"] = page.ToString()
};
return client.UploadValues(url, values);
}
}


برای تفسیر JSON از DecodePage استفاده می کنیم، علاوه بر اضافه کردن پیام ها در جدول dt این متد تعداد کل صفحات رو بر می گردونه :

private static int DecodePage(byte[] bytes, DataTable dt)
{
var serializer = new DataContractJsonSerializer(typeof(PageData));
using (var stream = new MemoryStream(bytes))
{
stream.Position = 0;
var page = (PageData)serializer.ReadObject(stream);
if (page.Code != 0)
{
throw new Exception(page.Message);
}
if ((page.Result == null) || (page.Result.Length == 0))
{
return 0;
}
var result = page.Result[0];
if (result.ReceivedMsgs == null)
{
return result.TotalPage;
}
foreach (var message in result.ReceivedMsgs)
{
var row = dt.NewRow();
row["Date"] = GetDateTime(message.Date);
row["Mobile"] = message.Mobile;
row["MsgBody"] = message.MsgBody;
dt.Rows.Add(row);
}
return result.TotalPage;
}
}


اگر فرض کنیم که یک DataGridView رو روی فرم قرار داده ایم، با همچین کدی می توانیم از کلاس SmsProvider استفاده کنیم که فرضا در طول یک ماه گذشته پیام ها رو دریافت کنه و نمایش بده :

try
{
var url = "https://www.xxxxxxxxx.com/api/smsAPI/ReceiveMessages";
var phoneNumber = "98300085552000111";
var startDate = DateTime.Now.AddMonths(-1);
var endDate = DateTime.Now;
var x = new SmsProvider("username", "password");
var dt = x.GetMessages(phoneNumber, url, startDate, endDate);
dataGridView1.DataSource = dt;
}
catch (Exception ex)
{
MessageBox.Show(this, ex.Message, ex.GetType().ToString(), MessageBoxButtons.OK, MessageBoxIcon.Error);
}


و کد پروژه :
151525

aidin2345
پنج شنبه 14 فروردین 1399, 15:02 عصر
[QUOTE=the king;2429699]
[/CSHARP]

در متد GetPage یک صفحه رو دریافت می کنیم، چیزی که دریافت میشه آرایه ای از بایت ها است که قاعدتا رشته در سیستم UTF8 خواهد بود :

private byte[] GetPage(string phoneNumber, string url, DateTime startDate, DateTime endDate, int page)
{
using (var client = new WebClient())
{
client.Headers[HttpRequestHeader.Authorization] = _authHeader;
var values = new NameValueCollection
{
["PhoneNumber"] = phoneNumber,
["StartDate"] = GetUnixTimestamp(startDate).ToString(),
["EndDate"] = GetUnixTimestamp(endDate).ToString(),
["Page"] = page.ToString()
};
return client.UploadValues(url, values);
}
}





سلام
THE KING جان عزیز دست گلت درد نکنه ، هر بار شرمنده کردی

فقط به این قسمت که مشخص کردم 12 تا خطا میگیره


151528

the king
پنج شنبه 14 فروردین 1399, 18:19 عصر
سلام
THE KING جان عزیز دست گلت درد نکنه ، هر بار شرمنده کردی

فقط به این قسمت که مشخص کردم 12 تا خطا میگیره


151528
مثل خود Visual Studio که هر بار نسخه جدیدتری ازش ارائه شده #C هم نسخه داره و ویژوال استدیو های جدیدتر نسخه #C بالاتری رو پشتیبانی می کنند که امکانات و قابلیت های جدیدتری داره. ویژوال استدیو تون قدری قدیمی است و این سبک نوشتن مدخل های دیکشنری که بهش Dictionary Initializer میگن رو در #C اش نداره :

private byte[] GetPage(string phoneNumber, string url, DateTime startDate, DateTime endDate, int page)
{
if (url.StartsWith("local://", StringComparison.Ordinal))
{
return Encoding.UTF8.GetBytes(File.ReadAllText( url.Substring(8)));
}
using (var client = new WebClient())
{
client.Headers[HttpRequestHeader.Authorization] = _authHeader;
var values = new NameValueCollection
{
["PhoneNumber"] = phoneNumber,
["StartDate"] = GetUnixTimestamp(startDate).ToString(),
["EndDate"] = GetUnixTimestamp(endDate).ToString(),
["Page"] = page.ToString()
};
return client.UploadValues(url, values);
}
}

برای حل مشکل، تبدیلش می کنیم به شیوه قدیمی تر که بعد از ایجاد کردن شیء values مدخل ها رو یکی یکی واردش می کنیم :

private byte[] GetPage(string phoneNumber, string url, DateTime startDate, DateTime endDate, int page)
{
if (url.StartsWith("local://", StringComparison.Ordinal))
{
return Encoding.UTF8.GetBytes(File.ReadAllText( url.Substring(8)));
}
using (var client = new WebClient())
{
client.Headers[HttpRequestHeader.Authorization] = _authHeader;
var values = new NameValueCollection();
values["PhoneNumber"] = phoneNumber;
values["StartDate"] = GetUnixTimestamp(startDate).ToString();
values["EndDate"] = GetUnixTimestamp(endDate).ToString();
values["Page"] = page.ToString();
return client.UploadValues(url, values);
}
}

aidin2345
جمعه 15 فروردین 1399, 20:36 عصر
مثل خود Visual Studio که هر بار نسخه جدیدتری ازش ارائه شده #C هم نسخه داره و ویژوال استدیو های جدیدتر نسخه #C بالاتری رو پشتیبانی می کنند که امکانات و قابلیت های جدیدتری داره. ویژوال استدیو تون قدری قدیمی است و این سبک نوشتن مدخل های دیکشنری که بهش Dictionary Initializer میگن رو در #C اش نداره :

private byte[] GetPage(string phoneNumber, string url, DateTime startDate, DateTime endDate, int page)
{
if (url.StartsWith("local://", StringComparison.Ordinal))
{
return Encoding.UTF8.GetBytes(File.ReadAllText( url.Substring(8)));
}
using (var client = new WebClient())
{
client.Headers[HttpRequestHeader.Authorization] = _authHeader;
var values = new NameValueCollection
{
["PhoneNumber"] = phoneNumber,
["StartDate"] = GetUnixTimestamp(startDate).ToString(),
["EndDate"] = GetUnixTimestamp(endDate).ToString(),
["Page"] = page.ToString()
};
return client.UploadValues(url, values);
}
}

برای حل مشکل، تبدیلش می کنیم به شیوه قدیمی تر که بعد از ایجاد کردن شیء values مدخل ها رو یکی یکی واردش می کنیم :

private byte[] GetPage(string phoneNumber, string url, DateTime startDate, DateTime endDate, int page)
{
if (url.StartsWith("local://", StringComparison.Ordinal))
{
return Encoding.UTF8.GetBytes(File.ReadAllText( url.Substring(8)));
}
using (var client = new WebClient())
{
client.Headers[HttpRequestHeader.Authorization] = _authHeader;
var values = new NameValueCollection();
values["PhoneNumber"] = phoneNumber;
values["StartDate"] = GetUnixTimestamp(startDate).ToString();
values["EndDate"] = GetUnixTimestamp(endDate).ToString();
values["Page"] = page.ToString();
return client.UploadValues(url, values);
}
}


سلام
آقا ممنونم که به دادم رسیدی
یه دوتا مساله
1- اینکه این سرویس رو بعد اینکه کامپایل کردم و روی سیستم افراد دیگه که ویندوز 7 دارن !!! اونوقت روی سیستم اونا مشکل ایجاد میکنه ؟؟

چون بعد تغیر کدها روی سیستم خودم که ویندوزش 10 ه و ویژوال استادیو 20012 خطای زیر رو داد

151532

و یه سیستم دیگه که ویندوز 7 سرویس پک 1 و آپدیت 2019 داره با ویژوال استادیو 2019
هم اجرا کردنی فوری استوپ میکنه


الان دارم ویژوال استادیو 2017 نصب میکنم ببینم روی اون چطور میشه

aidin2345
یک شنبه 31 فروردین 1399, 11:39 صبح
سلام
the king عزیز متاسفانه هر کاری کردم همون خطا رو میده
قربوت دستت یه کمک کن

the king
یک شنبه 31 فروردین 1399, 13:41 عصر
سلام
the king عزیز متاسفانه هر کاری کردم همون خطا رو میده
قربوت دستت یه کمک کن

احتمالا برخی از این موارد ربطی به دلیل خطای مورد نظر ندارند، اما این موارد رو امتحان کنید :

وقتی پروژه تون رو در ویژوال استدیو باز کردید ابتدا در پنجره Solution Explorer فایل های کد پروژه تان را بررسی کنید و ببینید App.config یا فایل دیگری با پسوند config در آن هست یا نه. اگر بود همان فایل را ویرایش می کنیم و اگر نبود باید یک نمونه اش را که بهش Application Configuration File می گویند اضافه کنیم.
برای اضافه کردن App.config به پروژه در منوی Project ویژوال استدیو گزینه ...Add New Item رو انتخاب کنید و بین گزینه ها Application Configuration File را انتخاب نمایید.
حالا فایل config مورد نظر را باز کرده و ویرایش کنید. ظاهرش چیزی شبیه به اینها است :



<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
</startup>
</configuration>



<?xml version="1.0" encoding="utf-8" ?>
<configuration>
</configuration>

در میان تگ شروع و پایان configuration یک تگ جدید به نام system.net را اضافه می کنیم که جمعا 5 سطر جدید خواهد بود :

<system.net>
<settings>
<httpWebRequest useUnsafeHeaderParsing = "true"/>
</settings>
</system.net>


مثلا :

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
</startup>
<system.net>
<settings>
<httpWebRequest useUnsafeHeaderParsing = "true"/>
</settings>
</system.net>
</configuration>



<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.net>
<settings>
<httpWebRequest useUnsafeHeaderParsing = "true"/>
</settings>
</system.net>
</configuration>


به متد GetPage دو سطر کد اضافه کنید. یک سطر مربوط به SecurityProtocol و یک سطر مربوط به Credentials


ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls | SecurityProtocolType.Ssl3;
client.Credentials = CredentialCache.DefaultCredentials;

اون دو سطر در این موقعیت ها اضافه می شوند، اولی درست قبل از using و دومی درست بعد از using :

private byte[] GetPage(string phoneNumber, string url, DateTime startDate, DateTime endDate, int page)
{
if (url.StartsWith("local://", StringComparison.Ordinal))
{
return Encoding.UTF8.GetBytes(File.ReadAllText(url.Substr ing(8)));
}
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls | SecurityProtocolType.Ssl3;
using (var client = new WebClient())
{
client.Credentials = CredentialCache.DefaultCredentials;
client.Headers[HttpRequestHeader.Authorization] = _authHeader;
.
.
.

aidin2345
چهارشنبه 03 اردیبهشت 1399, 20:45 عصر
احتمالا برخی از این موارد ربطی به دلیل خطای مورد نظر ندارند، اما این موارد رو امتحان کنید :

وقتی پروژه تون رو در ویژوال استدیو باز کردید ابتدا در پنجره Solution Explorer فایل های کد پروژه تان را بررسی کنید و ببینید App.config یا فایل دیگری با پسوند config در آن هست یا نه. اگر بود همان فایل را ویرایش می کنیم و اگر نبود باید یک نمونه اش را که بهش Application Configuration File می گویند اضافه کنیم.
برای اضافه کردن App.config به پروژه در منوی Project ویژوال استدیو گزینه ...Add New Item رو انتخاب کنید و بین گزینه ها Application Configuration File را انتخاب نمایید.
حالا فایل config مورد نظر را باز کرده و ویرایش کنید. ظاهرش چیزی شبیه به اینها است :



<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
</startup>
</configuration>



<?xml version="1.0" encoding="utf-8" ?>
<configuration>
</configuration>

در میان تگ شروع و پایان configuration یک تگ جدید به نام system.net را اضافه می کنیم که جمعا 5 سطر جدید خواهد بود :

<system.net>
<settings>
<httpWebRequest useUnsafeHeaderParsing = "true"/>
</settings>
</system.net>


مثلا :

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
</startup>
<system.net>
<settings>
<httpWebRequest useUnsafeHeaderParsing = "true"/>
</settings>
</system.net>
</configuration>



<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.net>
<settings>
<httpWebRequest useUnsafeHeaderParsing = "true"/>
</settings>
</system.net>
</configuration>


به متد GetPage دو سطر کد اضافه کنید. یک سطر مربوط به SecurityProtocol و یک سطر مربوط به Credentials


ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls | SecurityProtocolType.Ssl3;
client.Credentials = CredentialCache.DefaultCredentials;

اون دو سطر در این موقعیت ها اضافه می شوند، اولی درست قبل از using و دومی درست بعد از using :

private byte[] GetPage(string phoneNumber, string url, DateTime startDate, DateTime endDate, int page)
{
if (url.StartsWith("local://", StringComparison.Ordinal))
{
return Encoding.UTF8.GetBytes(File.ReadAllText(url.Substr ing(8)));
}
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls | SecurityProtocolType.Ssl3;
using (var client = new WebClient())
{
client.Credentials = CredentialCache.DefaultCredentials;
client.Headers[HttpRequestHeader.Authorization] = _authHeader;
.
.
.


سلام
مواردی رو که گفتین دقیقا اعمال کردم ولی متاسفانه کوچگترین تغییری نکرد
همون خطای قبلی رو میده


این نرم افزاری که زحمت کشیدین و نوشتین روی سیستم خودتون خطا میده ؟

the king
چهارشنبه 03 اردیبهشت 1399, 21:57 عصر
سلام
مواردی رو که گفتین دقیقا اعمال کردم ولی متاسفانه کوچگترین تغییری نکرد
همون خطای قبلی رو میده


این نرم افزاری که زحمت کشیدین و نوشتین روی سیستم خودتون خطا میده ؟
امکان بررسی متد GetPage و دریافت از سرویس تحت وب رو ندارم، چون من به پنل پیامک مورد نظر شما دسترسی نداشتم.
برای همین خودم برای امتحان از فایل بصورت local اطلاعات json رو دریافت کردم، نه از سرویس وب.
صرفا بر اساس پیام خطایی که نشون دادید راه حل های متعارفی که در اینترنت هست رو ذکر کردم.

aidin2345
پنج شنبه 04 اردیبهشت 1399, 11:58 صبح
امکان بررسی متد GetPage و دریافت از سرویس تحت وب رو ندارم، چون من به پنل پیامک مورد نظر شما دسترسی نداشتم.
برای همین خودم برای امتحان از فایل بصورت local اطلاعات json رو دریافت کردم، نه از سرویس وب.
صرفا بر اساس پیام خطایی که نشون دادید راه حل های متعارفی که در اینترنت هست رو ذکر کردم.

آقا ، یه زحمت بدم و لینک و یوزر و پس رو بدم
میشه یه وقت بذارین و چک کنین ؟؟؟

the king
پنج شنبه 04 اردیبهشت 1399, 21:17 عصر
برای رفع خطای SSL TLS یک تغییر مختصر در کد GetPage دادم :

using System.Security.Cryptography.X509Certificates;
.
.
.
private byte[] GetPage(string phoneNumber, string url, DateTime startDate, DateTime endDate, int page)
{
if (url.StartsWith("local://", StringComparison.Ordinal))
{
return Encoding.UTF8.GetBytes (File.ReadAllText(url.Substring(8)));
}
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072 | (SecurityProtocolType)768 | SecurityProtocolType.Tls | SecurityProtocolType.Ssl3;
ServicePointManager.Expect100Continue = true;
ServicePointManager. ServerCertificateValidationCallback = ServerCertificateValidation;
using (var client = new WebClient())
{
client.Headers [HttpRequestHeader.Authorization] = _authHeader;
client.Credentials = CredentialCache.DefaultCredentials;
var values = new NameValueCollection
{
["PhoneNumber"] = phoneNumber,
["StartDate"] = GetUnixTimestamp(startDate).ToString(),
["EndDate"] = GetUnixTimestamp(endDate).ToString(),
["Page"] = page.ToString()
};
return client.UploadValues(url, values);
}
}

private bool ServerCertificateValidation(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
return true;
}