Запросите Веб-страницу в c#, имитирующем Хост

Вы правы.

C17 draft § 6.5:

  1. У объекта должно быть сохраненное значение, доступное только через выражение lvalue, которое имеет один из следующих типов: 89) < / sup>

    • тип, совместимый с эффективным типом объекта,

    • квалифицированная версия типа, совместимого с эффективным типом объекта. объект,

    • тип, который является типом со знаком или без знака, соответствующим эффективному типу объекта,

    • тип, который является тип со знаком или без знака, соответствующий квалифицированной версии действующего типа объекта,

    • агрегатный или объединенный тип, который включает в себя один из вышеупомянутых типов среди своих членов (включая, рекурсивно, член субагрегированный или содержащий объединение), или
    • тип символа.

В этом случае объект имеет тип uint8_t[], а тип выражения lvalue - Message. Ни одно из вышеперечисленных исключений не применимо.

Использование memcpy для разыменования устраняет эту проблему, или, в качестве альтернативы, вы можете отключить строгие псевдонимы в вашем компиляторе, если хотите писать не на языке Си.

Но даже после этого код имеет много проблем и не переносим: битовые поля крайне плохо определены в стандарте, а общие структуры - очень неуклюжий способ обработки сериализации. Вы должны воспользоваться возможностью десериализации каждого члена вручную.

11
задан bignose 3 May 2009 в 23:48
поделиться

4 ответа

Мне удалось узнать более длинный обветренный маршрут при помощи сокетов. Я нашел ответ на странице MSDN для IPEndPoint:

string getString = "GET /path/mypage.htm HTTP/1.1\r\nHost: www.mysite.mobi\r\nConnection: Close\r\n\r\n";
Encoding ASCII = Encoding.ASCII;
Byte[] byteGetString = ASCII.GetBytes(getString);
Byte[] receiveByte = new Byte[256];
Socket socket = null;
String strPage = null;
try
{
    IPEndPoint ip = new IPEndPoint(IPAddress.Parse("10.23.1.93"), 80);
    socket = new Socket(ip.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
    socket.Connect(ip);
}
catch (SocketException ex)
{
    Console.WriteLine("Source:" + ex.Source);
    Console.WriteLine("Message:" + ex.Message);
}
socket.Send(byteGetString, byteGetString.Length, 0);
Int32 bytes = socket.Receive(receiveByte, receiveByte.Length, 0);
strPage = strPage + ASCII.GetString(receiveByte, 0, bytes);

while (bytes > 0)
{
    bytes = socket.Receive(receiveByte, receiveByte.Length, 0);
    strPage = strPage + ASCII.GetString(receiveByte, 0, bytes);
}
socket.Close();
9
ответ дан 3 December 2019 в 03:19
поделиться

Хорошо, немного исследования поднимает это:

https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx? FeedbackID=384456

Кажется, что MS может сделать что-то об этом в какой-то момент.

0
ответ дан 3 December 2019 в 03:19
поделиться

Заголовок "Хоста" защищен и не может быть изменен программно. Я предполагаю для работы вокруг этого, Вы могли попытаться связать через отражение с частным свойством "InnerCollection" объекта WebRequest, и вызов площади "Набора" "Добавляют" метод на нем для изменения заголовка Хоста. Я не попробовал это, но от беглого взгляда на исходный код в Отражателе, я думаю, что он легко выполняется. Но да, привязка к частным собственностям объектов платформы не является лучшим способом выполнить вещи.:) Используйте, только если Вы ДОЛЖНЫ.

править: Или как другие упоминания парня в связанном вопросе, просто откройте сокет и сделайте быстрое "ДОБИРАЕТСЯ" вручную. Не должен быть никакой brainer, если Вы не должны переделывать другой материал, как cookie или безотносительно тонкостей, HttpWebRequest обеспечивает.

0
ответ дан 3 December 2019 в 03:19
поделиться

Я знаю, что это старая тема, но я столкнулся с такой же проблемой, и я нашел лучшее решение, чем использование сокетов или отражения...

Что я сделал, так это создал новый класс, который берется из WebHeaderCollection и обходит проверку того, что вы вставляете в него:

public class MyHeaderCollection:WebHeaderCollection
{
    public new void Set(string name, string value)
    {
        AddWithoutValidate(name, value);
    }
    //or
    public new string this[string name]
    {
        get { return base[name]; }
        set { AddWithoutValidate(name, value); }
    }
}

и вот как вы его используете:

    var http = WebRequest.Create("http://example.com/");
    var headers = new MyHeaderCollection();
    http.Headers = headers;

    //Now you can add/override anything you like without validation:
    headers.Set("Host", http.RequestUri.Host);
    //or
    headers["Host"] = http.RequestUri.Host;

Надеюсь, это поможет всем, кто ищет это!

2
ответ дан 3 December 2019 в 03:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: