public async Task <Response <FaceDetectResult> > DetectAsync(CancellationToken cancellation, string imagePath, FaceDetectOptions options) { if (options == null) { options = new FaceDetectOptions(); } Uri uri = BuildUri(options); HttpMessage message = null; try { message = _client.CreateMessage(_options, cancellation); message.SetRequestLine(PipelineMethod.Post, uri); message.AddHeader(_keyHeader); message.AddHeader(HttpHeader.Common.OctetStreamContentType); SetContentStream(message, imagePath); await _client.ProcessAsync(message).ConfigureAwait(false); Response response = message.Response; if (!response.TryGetHeader(s_contentLength, out long contentLength)) { throw new Exception("bad response: no content length header"); } var buffer = new byte[contentLength]; var read = await response.ContentStream.ReadAsync(buffer, cancellation); Func <Response, FaceDetectResult> contentParser = null; if (response.Status == 200) { contentParser = (rsp) => { return(FaceDetectResult.Parse(new ReadOnlySequence <byte>(buffer, 0, read))); }; } return(new Response <FaceDetectResult>(response, contentParser)); } catch { if (message != null) { message.Dispose(); } throw; } }
public async Task <Response <FaceDetectResult> > DetectAsync(CancellationToken cancellation, Uri image, FaceDetectOptions options) { if (options == null) { options = new FaceDetectOptions(); } Uri uri = BuildUri(options); PipelineCallContext context = null; try { context = _client.CreateContext(_options, cancellation); context.SetRequestLine(ServiceMethod.Post, uri); context.AddHeader(_keyHeader); context.AddHeader(Header.Common.JsonContentType); context.SetContent(new FaceContent(image, context)); await _client.ProcessAsync(context).ConfigureAwait(false); ServiceResponse response = context.Response; if (!response.TryGetHeader(s_contentLength, out long contentLength)) { throw new Exception("bad response: no content length header"); } var buffer = new byte[contentLength]; var read = await response.ContentStream.ReadAsync(buffer, cancellation); Func <ServiceResponse, FaceDetectResult> contentParser = null; if (response.Status == 200) { contentParser = (rsp) => { return(FaceDetectResult.Parse(new ReadOnlySequence <byte>(buffer, 0, read))); }; } return(new Response <FaceDetectResult>(response, contentParser)); } catch { if (context != null) { context.Dispose(); } throw; } }
static void SetValue(ref Utf8JsonReader json, JsonState state, ref FaceDetectResult result) { switch (state) { // floats case JsonState.age: result.Age = json.GetValueAsSingle(); break; case JsonState.smile: result.Smile = json.GetValueAsSingle(); break; // strings case JsonState.gender: result.Gender = json.GetValueAsString(); break; case JsonState.faceId: result.FaceId = json.GetValueAsString(); break; default: break; } }
public static FaceDetectResult Parse(ReadOnlySequence <byte> content) { var result = new FaceDetectResult(); var json = new Utf8JsonReader(content, true); JsonState state = JsonState.Other; while (json.Read()) { switch (json.TokenType) { case JsonTokenType.PropertyName: state = json.Value.ToJsonState(); break; case JsonTokenType.Number: case JsonTokenType.String: SetValue(ref json, state, ref result); break; } } return(result); }