WebAPI v2.1 и выше поддерживает BSON (двоичный JSON) из коробки и даже имеет MediaTypeFormatter
, включенный для него. Это означает, что вы можете опубликовать все свое сообщение в двоичном формате.
Если вы хотите его использовать, вам нужно установить его в WebApiConfig
:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Formatters.Add(new BsonMediaTypeFormatter());
}
}
Теперь, вы используете тот же BsonMediaTypeFormatter
на стороне клиента для сериализации вашего запроса:
public async Task SendRequestAsync()
{
var client = new HttpClient
{
BaseAddress = new Uri("http://www.yourserviceaddress.com");
};
// Set the Accept header for BSON.
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/bson"));
var request = new SomePostRequest
{
Id = 20,
Content = new byte[] { 2, 5, 7, 10 }
};
// POST using the BSON formatter.
MediaTypeFormatter bsonFormatter = new BsonMediaTypeFormatter();
var result = await client.PostAsync("api/SomeData/Incoming", request, bsonFormatter);
result.EnsureSuccessStatusCode();
}
Или вы можете использовать Json.NET для сериализации вашего класса в BSON. Затем укажите, что вы хотите использовать «application / bson» в качестве вашего «Content-Type»:
public async Task SendRequestAsync()
{
using (var stream = new MemoryStream())
using (var bson = new BsonWriter(stream))
{
var jsonSerializer = new JsonSerializer();
var request = new SomePostRequest
{
Id = 20,
Content = new byte[] { 2, 5, 7, 10 }
};
jsonSerializer.Serialize(bson, request);
var client = new HttpClient
{
BaseAddress = new Uri("http://www.yourservicelocation.com")
};
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/bson"));
var byteArrayContent = new ByteArrayContent(stream.ToArray());
byteArrayContent.Headers.ContentType = new MediaTypeHeaderValue("application/bson");
var result = await client.PostAsync(
"api/SomeData/Incoming", byteArrayContent);
result.EnsureSuccessStatusCode();
}
}
[Важно понять, что техника ISite ниже только работает во время проектирования. Поскольку ContainerControl общедоступен и присвоен значение, VisualStudio запишет код инициализации, который устанавливает его во времени выполнения. Сайт установлен во времени выполнения, но Вы не можете добраться, ContainerControl от него]
Вот статья , которая описывает, как сделать это для невидимого компонента.
В основном необходимо добавить свойство ContainerControl к компоненту:
public ContainerControl ContainerControl
{
get { return _containerControl; }
set { _containerControl = value; }
}
private ContainerControl _containerControl = null;
и переопределение свойство Site:
public override ISite Site
{
get { return base.Site; }
set
{
base.Site = value;
if (value == null)
{
return;
}
IDesignerHost host = value.GetService(
typeof(IDesignerHost)) as IDesignerHost;
if (host != null)
{
IComponent componentHost = host.RootComponent;
if (componentHost is ContainerControl)
{
ContainerControl = componentHost as ContainerControl;
}
}
}
}
, Если Вы делаете это, ContainerControl будет инициализирован для ссылки на содержание формы разработчиком. Связанная статья объясняет его более подробно.
А хороший способ видеть, как сделать, вещи состоят в том, чтобы посмотреть на реализацию Типов в Платформе.NET, которые имеют поведение, подобное тому, что Вы хотите с инструментом, таким как Отражатель Лутца. В этом случае, Система. Windows. Формы. ErrorProvider является хорошим примером для взгляда на: Компонент, который должен знать его содержание Формы.
Я использую рекурсивный вызов для хождения по цепочке управления. Добавьте это к своему управлению.
public Form ParentForm
{
get { return GetParentForm( this.Parent ); }
}
private Form GetParentForm( Control parent )
{
Form form = parent as Form;
if ( form != null )
{
return form;
}
if ( parent != null )
{
// Walk up the control hierarchy
return GetParentForm( parent.Parent );
}
return null; // Control is not on a Form
}
Редактирование: я вижу, что Вы изменили свой вопрос, поскольку я вводил это. Если это - компонент, конструктор того компонента должен взять, это - родитель в качестве параметра, и родитель должен передать в этом, когда создано. Несколько других компонентов делают это, такое как таймер.
Сохраняют родительское управление как участника и затем используют его в свойстве ParentForm, которое я дал Вам выше вместо этого.
Необходимо будет установить родительский контейнер некоторые как. Ваш компонент является просто классом, который находится в памяти точно так же, как все остальное. Это не имеет никакого истинного контекста того, что создало его, если что-то не говорит Вам, что сделало. Создайте Родительское свойство элемента управления и установите его.
Или просто происходят из управления и используют FindForm (). Не все средства управления должны иметь видимый компонент
Если componenet справляется с другими визуальными средствами управления, то необходимо быть в состоянии добраться до родителя через них.
Я думаю, что Вы хотите использовать свойство Site IComponent. Это - более или менее эквивалент свойству Parent.