В целом:
В основном POST не является идемпотентной операцией . Таким образом, Вы не можете использовать его для кэширования. ДОБЕРИТЕСЬ должна быть идемпотентная операция, таким образом, это является наиболее часто используемым для кэширования.
посмотрите раздел 9.1 из , RFC 2616 S. 9.1 .
HTTP 1.1 Кроме ПОЛУЧАЕТ семантику метода:
сам метод THE POST семантически предназначен для регистрации чего-то на ресурс. POST не может кэшироваться, потому что, если Вы делаете что-то однажды по сравнению с дважды по сравнению с тремя разами, тогда Вы изменяете ресурс сервера каждый раз. Каждый запрос вопросы и должен быть поставлен серверу.
сам ПОМЕЩЕННЫЙ метод семантически предназначен, чтобы поместить или создать ресурс. Это - идемпотентная операция, но это не будет использоваться для кэширования, потому что УДАЛЕНИЕ, возможно, произошло тем временем.
сам УДАЛИТЬ метод семантически предназначен для удаления ресурса. Это - идемпотентная операция, но это не будет использоваться для кэширования, потому что ПОМЕЩЕННЫЙ, возможно, произошел тем временем.
Относительно клиентского кэширования:
веб-браузер А будет всегда передавать Ваш запрос, даже если он будет иметь ответ от предыдущей операции POST. Например, можно послать электронные письма с Gmail пара дней независимо. Они могут быть тем же предметом и телом, но оба электронных письма должны быть посланы.
Относительно кэширования на прокси-сервере:
А проксируют сервер HTTP, который передает Ваше сообщение к серверу, ничего никогда не кэшировал бы кроме ПОЛУЧЕНИЯ или ГЛАВНОГО запроса.
Относительно кэширования сервера:
сервер А по умолчанию автоматически не обработал бы запрос POST через проверку его кэша. Но конечно запрос POST может быть отправлен к Вашему приложению или дополнению, и у Вас может быть свой собственный кэш, который Вы читаете из того, когда параметры являются тем же.
Лишение законной силы ресурса:
Проверка RFC 2616 S. 13.10 HTTP 1.1 показывает, что метод POST должен делать недействительным ресурс для кэширования.
Ваш AbstractClass
должен обеспечивать реализацию для Свойство
из интерфейса IBase
, даже если это просто абстракция:
public abstract class AbstractClass : IBase
{
public override string ToString()
{
return "I am abstract";
}
public abstract string Property { get; }
}
Обновление: Люк прав, что в конкретной реализации необходимо указать, что Свойство
является переопределением, иначе вы получите сообщение «не реализует унаследованный абстрактный член. "ошибка:
public class ConcreteClass : AbstractClass
{
public override string Property {
get {
return "I am Concrete";
}
}
}
AbstractClass должен реализовывать IBase, который содержит свойство, а вы не реализовали его
Ваш абстрактный класс не реализует интерфейс IBase
. Просто добавьте свойство Property
в AbstractClass
.
public abstract String Property { get; }
Вы должны добавить абстрактную реализацию свойства в свой AbstractClass:
public abstract class AbstractClass : IBase
{
public override string ToString()
{
return "I am abstract";
}
public abstract string Property { get; }
}
И ключевое слово override в класс Concrete
Вам необходимо объявить Свойство
в AbstractClass
, чтобы оно выполняло контракт IBase
.
Если вы хотите ConcreteClass
, чтобы иметь возможность переопределить Свойство
, тогда вы должны объявить его как abstract
или virtual
. Затем вам необходимо объявить реализацию ConcreteClass
свойства
с переопределением
.
public interface IBase
{
string Property { get; }
}
public abstract class AbstractClass : IBase
{
public abstract string Property { get; }
public override string ToString()
{
return "I am abstract";
}
}
public class ConcreteClass : AbstractClass
{
public override string Property
{
get
{
return "I am Concrete";
}
}
}
Вам необходимо реализовать IBase -property Свойство следующим образом:
public abstract class AbstractClass : IBase
{
public override string Property()
{
return "This is the base-class implementation";
}
}
Или сделать его абстрактным .
]Вы должны реализовать свойство Property в абстрактном классе.