Я использую ASP.NET WebForms, что означает, что я буду отправлять данные Protobuf через страницы ASPX или ASHX.
Я пытаюсь создать файл GTFSRT, для которого есть пакет Nuget с именем GTFSRealTimeBindings. Это использует Protobuf и Protobuf-net для сжатия и отправки данных.
Проблема, с которой я сталкиваюсь, заключается в том, что при отправке данных что-то смешивается, поэтому их нельзя прочитать на принимающей стороне, и я не знаю, как это исправить. Я думаю, что дело в кодировке, но я ее не устанавливаю, поэтому не знаю, как ее изменить.
В итоге я написал обработчик http (страница ashx), который загрузит файл GTFS из другого источника, а затем просто попытается переслать его. Я знаю, что файл GTFS можно прочитать и декодировать из другого источника. Но каждый раз, когда я пытаюсь серверировать файл со своей страницы ashx, я не могу декодировать объект protbuf.
Вот очень простой набор кодов:
public class Vehicles : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
WebRequest req = HttpWebRequest.Create("https://cdn.mbta.com/realtime/VehiclePositions.pb");
FeedMessage feed = Serializer.Deserialize<FeedMessage>(req.GetResponse().GetResponseStream());
Serializer.Serialize(context.Response.OutputStream, feed);
}
}
В этом фрагменте вы заметите, что я загружаю файл Protobuf с cdn.mbta.com, а затем просто пытаюсь взять полученный результат и передать его обратно.
Когда я пытаюсь прочитать это в своем примере приложения:
WebRequest req = HttpWebRequest.Create("http://localhost:54988/Secure/Admin/Reports/GtfsRt/Vehicles.ashx");
FeedMessage feed = Serializer.Deserialize<FeedMessage>(req.GetResponse().GetResponseStream());
Я получаю сообщение: «Недопустимый тип провода; обычно это означает, что вы перезаписали файл без усечения или установки длины; см. http://stackoverflow.com/q/2152978/23354'
Если я запускаю Fiddler во время обращения к этой странице, я замечаю, что ответ, который я получаю от cdn.mbta.com, отличается от ответа, который дает эта страница (конечно, за вычетом заголовков).
Например, первые две строки с mbta.com в fiddler показывают:
2.0 ] y1601"T
Но первые две строчки моего ответа такие: 2.0 W y1601"N
Любые идеи о том, что вызывает это, и как я могу это исправить? Я попытался установить кодировку, используя
content.Response.ContentEncoding=Encoding.Utf8
Я и я перепробовали все остальные кодировки, чтобы попытаться установить его правильно.
======ОБНОВЛЕНИЕ====== В ответ на вопрос Марка я взял строку полезной нагрузки ответа в формате Base64, и ответ из первого источника не соответствует ответу после его пересылки.
Ответ от mbta.com (не более первых символов): Cg0KAzIumMBAAGI/e8eIFEl0KBXkwNzIzIlQKHAoIMzkyNTAwNjcqAjg4MAAaCDIwMTkwMjA3IABCDg
Ответ от моей службы (не более первых нескольких символов): CgsKAzIuMBiP3vHiBRJXCgV5MDcyMyJOChgKCDM5MjUwMDY3GggyMDE5MDIwNyoCODgSFA3skilCFQ
Как видите, они разные. Я буду работать над решением, которое я могу загрузить, чтобы продемонстрировать проблему. Еще раз спасибо!