Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.10.2014, 20:57   #1
Rymbil
Пользователь
 
Регистрация: 01.10.2009
Сообщений: 38
По умолчанию post запрос к yandex speech

Здравствуйте, пытаюсь отправить wav файл на распознавание в яндекс, но получаю ошибку 400 invalid character in header.
HTTP/1.0 400 Bad Request
Access-Control-Allow-Origin: *
Connection: close
Content-Length: 30
Content-Type: text/html
Date: Thu, 02 Oct 2014 20:51:50 MSK
Server: YaVoiceProxy2
X-YaReqFinish: 1412268710.823475
X-YaRequestId: 67dd3d12-4a54-11e4-9ede-ca3799e7ec61

invalid character in header!

Можете сказать че не так?
Код:
public void soket(byte[] file)
        {
            IPEndPoint ipe = new IPEndPoint(IPAddress.Parse("213.180.193.202"), 80);
            using (Socket socket = new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp))
                {
                    try
                    {
                        socket.Connect(ipe);
                        if (!socket.Connected)
                            MessageBox.Show("Не удалось подключится");
                    }
                    catch (SocketException ex)
                    {
                        MessageBox.Show(ex.Message);
                    }
                    // 
                    string request =
                    "POST /asr_xml?uuid=01ae13cb744628b58fb536d496daa1e6&key=тут-мой-ключ-который-мне-выдал-яндекс&topic=queries HTTP/1.1\r\n" +
                    "Content-Type: audio/x-wav\r\n" +
                    "User-Agent: Rymbil\r\n" +
                    "Host: asr.yandex.net\r\n" +
                    "Transfer-Encoding: chunked\r\n" +
                    "Content-Length: " + file.Length + "\r\n";      

                    byte[] bytes1 = Encoding.ASCII.GetBytes(request);
                    byte[] final = new byte[bytes1.Length + file.Length];
                    Array.Copy(bytes1, final, bytes1.Length);
                    Array.Copy(file,0,final,request.Length,file.Length);
                   
                    Byte[] bytesReceived = new Byte[1024];
                    socket.Send(final);
                    string page = "";
                    int bytes = 0;
                    do
                    {
                        bytes = socket.Receive(bytesReceived, bytesReceived.Length, 0);
                        page = page + Encoding.ASCII.GetString(bytesReceived);
                    }
                    while (bytes > 0);
                    socket.Disconnect(false);
                 
                }
         }
Rymbil вне форума Ответить с цитированием
Старый 02.10.2014, 22:50   #2
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

И вам доброго времени суток! А почему именно сокет? HttpWebRequest чем вам не угодил?
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 03.10.2014, 06:21   #3
Rymbil
Пользователь
 
Регистрация: 01.10.2009
Сообщений: 38
По умолчанию

С ним я пробовал, тоже самое получал, тут хотя бы смог прочитать про invalid character in header, там просто исключение срабатывало и ошибка 400 писалась=(
Rymbil вне форума Ответить с цитированием
Старый 03.10.2014, 17:08   #4
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

Попробуйте с помощью Fiddler отправлять копипасту примеров из какой-нибудь справки.

Проверьте, везде ли у вас нужный перенос строки, попробуйте /n и /r/n.
ds.Dante вне форума Ответить с цитированием
Старый 03.10.2014, 18:35   #5
Rymbil
Пользователь
 
Регистрация: 01.10.2009
Сообщений: 38
По умолчанию Заработал HttpWebRequest

Вот теперь работает

public static string PostMethod(byte[] bytes)
{
string postUrl = "https://asr.yandex.net/asr_xml?"+
"uuid=01ae13cb744628b58fb536d496daa 1e6&" +
"key=ключ&"+
"topic=queries";

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(p ostUrl);
request.Method = "POST";
request.Host = "asr.yandex.net";
request.SendChunked = true;
request.UserAgent = "Oleg";

request.ContentType = "audio/x-wav";
request.ContentLength = bytes.Length;

using (var newStream = request.GetRequestStream())
{
newStream.Write(bytes, 0, bytes.Length);
}

HttpWebResponse response = (HttpWebResponse)request.GetRespons e();
string responseToString="";
if (response != null)
{
var strreader = new StreamReader(response.GetResponseSt ream(), Encoding.UTF8);
responseToString = strreader.ReadToEnd();
}

int index = responseToString.IndexOf("<variant confidence=\"1\">");

responseToString = responseToString.Substring(index + 24, responseToString.Length - index - 24);

int index2 = responseToString.IndexOf("</variant>");

responseToString = responseToString.Substring(0, index2);

return responseToString;
}

Почему не работала раньше эта функция я так и не понял, сравнивал со старым вариантом построчно, только входные параметры поменял. Магия.
Хотя скорость распознавания оставляет желать лучшего, бывает доходит до 10 секунд.
Всем спасибо.
Rymbil вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запрос к Yandex переводчику из программы на c# rmv240899 Общие вопросы .NET 1 20.12.2012 05:27
Post запрос STALERUM Работа с сетью в Delphi 1 16.09.2012 21:10
Post запрос Arsenx777 PHP 0 19.04.2012 19:35
POST запрос bunukar Работа с сетью в Delphi 6 27.11.2011 19:26
Post запрос Arsenx777 Работа с сетью в Delphi 4 18.08.2011 19:56