2013-09-23 3 views
1

Я пытаюсь отправить SMS-сообщение из тестового кода модуля C#, но я не могу получить текстовое сообщение, и я не знаю, где его отладить.Отправка текстового SMS-сообщения с использованием twilio не работает

Кроме того, внутри моего объекта ответа я получаю значение «Плохой запрос». Что я делаю не так. Также в цикле while я жду ответа для обработки.

Вот мой код.

[TestMethod] 
    public void TestMethod1() 
    { 
     Assert.IsTrue(SendMessage("+1MYFROMPHONENUMBER", "+1MYTOPHONENUMBER", "sending from code")); 
    } 

    public bool SendMessage(string from, string to, string message) 
    { 
     var accountSid = "MYACCOUNTSIDFROMTWILIOACCOUNT"; 
     var authToken = "MYAUTHTOKENFROMTWILIOACCOUNT"; 
     var targeturi = "https://api.twilio.com/2010-04-01/Accounts/{0}/SMS/Messages"; 
     var client = new System.Net.Http.HttpClient(); 
     client.DefaultRequestHeaders.Authorization = CreateAuthenticationHeader("Basic", accountSid, authToken); 
     var content = new StringContent(string.Format("From={0}&To={1}&Body={2}", from, to, message)); 
     content.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded"); 
     var result = false; 
     var response = client.PostAsync(string.Format(targeturi, accountSid), content).Result; 
     do 
     { 
      result = response.IsSuccessStatusCode; 
     } while (result == false); 
     return result; 
    } 

ответ

4

Вы делаете асинхронный запрос, но не ожидаете результата. Попробуйте:

var response = client.PostAsync(..).Result; 
return response.IsSuccessStatusCode; 

Кроме того, вы должны быть в состоянии форматировать параметры более легко/безопасно, используя FormUrlEncodedContent типа, вместо StringContent. Кажется, это сделано для того, чтобы поддержать то, что вы пытаетесь сделать. Например.

var dict = new Dictionary<string, string> 
    { { "From", from }, { "To", to }, { "Body", message } }; 
var content = new FormUrlEncodedContent(dict); 

И так как это создает другое тело запроса, чем ваш content, это может быть причиной ошибки «Bad Request». Два способа сделать это кодируют специальные символы, как &, разделяющие части, так и сами строки, совершенно по-другому. Например.

string from = "+1234567890", to = "+56789", message = "hi & bye+2"; 
//FormUrlEncodedContent results: 
From=%2B1234567890&To=%2B56789&Body=hi+%26+bye%2B2 
//StringContent results: 
From=+1234567890&amp;To=+56789&amp;Body=hi & bye+2 
+0

Я отредактировал свой вопрос. –

+0

@ dotnet-practitioner Из [twilio documentation] (http://www.twilio.com/docs/api/rest/request) «Плохой запрос» означает «Данные, полученные в результате неудачной проверки POST или PUT. для деталей. " Посмотрите на это тело ответа и сообщите мне, есть ли у вас вопросы. И избавитесь от цикла 'do..while', это не делает вам ничего хорошего: после того, как вы' ждёте' или выполните '.Result', запрос будет выполнен, и ничего не изменится. –

+0

@ dotnet-practitioner Я добавил предложение использовать 'FormUrlEncodedContent'. Это делает другой запрос, чем ваш код 'StringContent'. Это может быть причиной ошибки «Плохой запрос». –

Смежные вопросы