Какой тип данных я должен использовать в устаревшем коде, где новый тип недоступен?

1

Этот код работает (в современных версиях.NET):

public static string SendXMLFile(string xmlFilepath, string uri, int timeout)
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);

    request.KeepAlive = false;
    request.ProtocolVersion = HttpVersion.Version10;
    request.ContentType = "application/xml";
    request.Method = "POST";

    StringBuilder sb = new StringBuilder();
    using (StreamReader sr = new StreamReader(xmlFilepath))
    {
        String line;
        while ((line = sr.ReadLine()) != null)
        {
            sb.AppendLine(line);
        }
        byte[] postBytes = Encoding.UTF8.GetBytes(sb.ToString());

        if (timeout < 0)
        {
            request.ReadWriteTimeout = timeout;
            request.Timeout = timeout;
        }

        request.ContentLength = postBytes.Length;
        request.KeepAlive = false;

        request.ContentType = "application/x-www-form-urlencoded";

        try
        {
            Stream requestStream = request.GetRequestStream();

            requestStream.Write(postBytes, 0, postBytes.Length);
            requestStream.Close();

            using (var response = (HttpWebResponse)request.GetResponse())
            {
                return response.ToString();
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
            request.Abort();
            return string.Empty;
        }
    }
}

Однако при попытке использовать его в DLL, используемом приложением Windows CE, связанным со старыми версиями Compact Framework и.NET, существует несколько проблем. Во-первых, я попытался изменить "var" на его явный тип; Я попытался изменить это:

using (var response = (HttpWebResponse)request.GetResponse())

...к этому:

using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())

... но это даже не работает - "HttpWebResponse" демонстрирует страшный красноватый синдром подчеркивания.

Нависая над squiggliness, я вижу: "Невозможно неявно преобразовать тип" HttpWebResponse "в" System.IDisposable "

Таким образом, я изменил "HttpWebResponse" на "System.IDisposable", и вся строка прошла круто. Что он действительно хочет - класс, который реализует IDisposable? Если да, то какой из них доступен/лучший выбор?

У меня также проблемы с HttpWebRequest, у которых нет свойства ReadWriteTimeout, а StringBuilder не имеет метода AppendLine(). Есть ли более старые версии этих членов, которые будут "в крайнем случае"?

Пока что я сделал это в отношении AppendLine:

sb.Append(line);
sb.Append("\r\n");

... и просто прокомментировал ReadWriteTimout:

if (timeout < 0)
{
    //request.ReadWriteTimeout = timeout;
    request.Timeout = timeout;

... но что касается проблемы с IDisposable, я делаю довольно красивую имитацию Stonewall Jackson.

Теги:
compact-framework
stringbuilder
idisposable
httpwebresponse

2 ответа

1
Лучший ответ

Что-то вроде этого, может быть?

HttpWebResponse response = null;
try
{
    response = (HttpWebResponse)request.GetResponse();
    return response.ToString();
}
finally
{
    var disposableResponse = response as IDisposable;
    if(disposableResponse != null) disposableResponse.Dispose();
}
  • 0
    это не типа IDisposable если я правильно понимаю
  • 0
    При попытке этого кода мне пришлось изменить «var» на IDisposable, и даже тогда «response as IDisposable» дает мне «Использование неназначенной локальной переменной« response »»
Показать ещё 2 комментария
1

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

  • 0
    Это заставляет его все равно компилироваться; Я проверю это сейчас.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню