Ваша конфигурация правильно устанавливает версию API по умолчанию, если она не указана. Но ваши маршруты требуют, чтобы URL запроса включал v{version}
часть. Поэтому одно из возможных решений - добавить еще один маршрут без v{version}
, например,
[ApiController]
[Route("v{version:apiVersion}/[controller]")]
[Route("/[controller]")]
[ApiVersion("1.0")]
public class UsersController : ControllerBase
{
[HttpGet("log")]
public string Get()
{
return $"{DateTime.Now}";
}
}
. Теперь запрос к http://localhost:5000/users/log
будет указывать на контроллер с версией API 1.0
. Если вы добавите этот маршрут ко второму контроллеру, версия 1.0
все равно будет выбрана, потому что будет выбрано значение по умолчанию ApiVersion
и будет 1.0
.
Вы не можете действительно сделать произвольные типы сериализуемыми; в некоторых случаях (XmlSerializer
, например), время выполнения выставляет опции имитировать атрибуты. Но DataContractSerializer
не позволяет это. Выполнимые опции:
По существу, если что-то не будет разработано для сериализации, то очень мало платформы позволит Вам сериализировать ее.
Я не эксперт WCF, но маловероятно, что они поддерживают сериализацию на конструкторе с произвольными типами. А именно, потому что, в чем они передали бы для значений? Вы могли передать пустой указатель для ссылочных типов и пустые значения для структур. Но что хороший тип был бы, это могло быть создано с абсолютно пустыми данными?
Я думаю, что Вы застреваете с 1 из 2 опций
Лично я пошел бы для № 2. Сделайте класс данными только структура и оптимизируйте его в целях фабрики и сериализации.
Я просто запустил немного теста, с помощью Сервиса WCF, который возвращает основной объект, который не имеет конструктора по умолчанию.
//[DataContract]
//[Serializable]
public class MyObject
{
public MyObject(string _name)
{
Name = _name;
}
//[DataMember]
public string Name { get; set; }
//[DataMember]
public string Address { get; set; }
}
Вот то, на что похож сервис:
public class MyService : IMyService
{
#region IMyService Members
public MyObject GetByName(string _name)
{
return new MyObject(_name) { Address = "Test Address" };
}
#endregion
}
Это на самом деле работает, пока MyObject или [DataContract] или [сериализуемый]. Интересно, этому, кажется, не нужен конструктор по умолчанию на стороне клиента. Здесь существует связанное сообщение:
Как десериализация WCF инстанцирует объектов, не вызывая конструктора?