/// <inheritdoc/> public override Task <object> ReadFromStreamAsync(Type type, Stream readStream, HttpContent content, IFormatterLogger formatterLogger) { if (type == null) { throw Error.ArgumentNull("type"); } if (readStream == null) { throw Error.ArgumentNull("readStream"); } object result = null; HttpContentHeaders contentHeaders = content == null ? null : content.Headers; // If content length is 0 then return default value for this type if (contentHeaders != null && contentHeaders.ContentLength == 0) { result = GetDefaultValueForType(type); } else { bool isPatchMode = TryGetInnerTypeForDelta(ref type); ODataDeserializer deserializer = ODataDeserializerProvider.GetODataDeserializer(type); if (deserializer == null) { throw Error.Argument("type", SRResources.FormatterReadIsNotSupportedForType, type.FullName, GetType().FullName); } ODataMessageReader oDataMessageReader = null; ODataMessageReaderSettings oDataReaderSettings = new ODataMessageReaderSettings { DisableMessageStreamDisposal = true }; try { IODataRequestMessage oDataRequestMessage = new ODataMessageWrapper(readStream, contentHeaders); oDataMessageReader = new ODataMessageReader(oDataRequestMessage, oDataReaderSettings, ODataDeserializerProvider.EdmModel); ODataDeserializerContext readContext = new ODataDeserializerContext { IsPatchMode = isPatchMode, PatchKeyMode = PatchKeyMode }; result = deserializer.Read(oDataMessageReader, readContext); } finally { if (oDataMessageReader != null) { oDataMessageReader.Dispose(); } } } return(TaskHelpers.FromResult(result)); }
private ODataDeserializer GetDeserializer(Type type, ODataPath path, IEdmModel model, ODataDeserializerProvider deserializerProvider, out IEdmTypeReference expectedPayloadType) { expectedPayloadType = GetExpectedPayloadType(type, path, model); if (expectedPayloadType != null) { return(deserializerProvider.GetEdmTypeDeserializer(expectedPayloadType)); } else { return(deserializerProvider.GetODataDeserializer(model, type, Request)); } }
/// <inheritdoc/> public override bool CanReadType(Type type) { if (type == null) { throw Error.ArgumentNull("type"); } if (_request != null) { IEdmModel model = _request.GetEdmModel(); if (model != null) { TryGetInnerTypeForDelta(ref type); ODataDeserializer deserializer = _deserializerProvider.GetODataDeserializer(model, type); if (deserializer != null) { return(_payloadKinds.Contains(deserializer.ODataPayloadKind)); } } } return(false); }
private ODataDeserializer GetDeserializer(Type type, ODataPath path, IEdmModel model, ODataDeserializerProvider deserializerProvider, out IEdmTypeReference expectedPayloadType) { expectedPayloadType = GetExpectedPayloadType(type, path, model); // Get the deserializer using the CLR type first from the deserializer provider. ODataDeserializer deserializer = deserializerProvider.GetODataDeserializer(model, type, Request); if (deserializer == null && expectedPayloadType != null) { // we are in typeless mode, get the deserializer using the edm type from the path. deserializer = deserializerProvider.GetEdmTypeDeserializer(expectedPayloadType); } return(deserializer); }
/// <summary> /// Gets an <see cref="ODataDeserializer"/> for the given type. /// The proxy provider will get the real provider to return the serializer. /// </summary> /// <param name="model">The EDM model.</param> /// <param name="type">The CLR type.</param> /// <param name="request">The request being deserialized.</param> /// <returns>An <see cref="ODataDeserializer"/> that can deserialize the given type.</returns> public override ODataDeserializer GetODataDeserializer(IEdmModel model, Type type, HttpRequestMessage request) { this.api = request.GetApiInstance(); if (this.api != null) { ODataDeserializerProvider provider = api.Context.GetApiService <ODataDeserializerProvider>(); if (provider != null) { return(provider.GetODataDeserializer(model, type, request)); } } // In case user uses his own controller or NonFound error for request return(DefaultRestierDeserializerProvider.SingletonInstance.GetODataDeserializer(model, type, request)); }
/// <inheritdoc/> public override bool CanReadType(Type type) { if (type == null) { throw Error.ArgumentNull("type"); } if (Request != null) { ODataDeserializerProvider deserializerProvider = Request.GetRequestContainer() .GetRequiredService <ODataDeserializerProvider>(); return(ODataInputFormatterHelper.CanReadType( type, Request.GetModel(), Request.ODataProperties().Path, _payloadKinds, (objectType) => deserializerProvider.GetEdmTypeDeserializer(objectType), (objectType) => deserializerProvider.GetODataDeserializer(objectType, Request))); } return(false); }
/// <inheritdoc/> public override bool CanRead(InputFormatterContext context) { if (context == null) { throw Error.ArgumentNull("context"); } HttpRequest request = context.HttpContext.Request; if (request == null) { throw Error.InvalidOperation(SRResources.ReadFromStreamAsyncMustHaveRequest); } // Ignore non-OData requests. if (request.ODataFeature().Path == null) { return(false); } Type type = context.ModelType; if (type == null) { throw Error.ArgumentNull("type"); } ODataDeserializerProvider deserializerProvider = request.GetRequestContainer().GetRequiredService <ODataDeserializerProvider>(); return(ODataInputFormatterHelper.CanReadType( type, request.GetModel(), request.ODataFeature().Path, _payloadKinds, (objectType) => deserializerProvider.GetEdmTypeDeserializer(objectType), (objectType) => deserializerProvider.GetODataDeserializer(objectType, request))); }
public override Task <object> ReadFromStreamAsync(Type type, Stream readStream, HttpContent content, IFormatterLogger formatterLogger) { if (type == null) { throw Error.ArgumentNull("type"); } if (readStream == null) { throw Error.ArgumentNull("readStream"); } if (Request == null) { throw Error.InvalidOperation(SRResources.ReadFromStreamAsyncMustHaveRequest); } object defaultValue = GetDefaultValueForType(type); // If content length is 0 then return default value for this type HttpContentHeaders contentHeaders = (content == null) ? null : content.Headers; if (contentHeaders == null || contentHeaders.ContentLength == 0) { return(Task.FromResult(defaultValue)); } try { Func <ODataDeserializerContext> getODataDeserializerContext = () => { return(new ODataDeserializerContext { Request = Request, }); }; Action <Exception> logErrorAction = (ex) => { if (formatterLogger == null) { throw ex; } formatterLogger.LogError(String.Empty, ex); }; ODataDeserializerProvider deserializerProvider = Request.GetRequestContainer() .GetRequiredService <ODataDeserializerProvider>(); return(Task.FromResult(ODataInputFormatterHelper.ReadFromStream( type, defaultValue, Request.GetModel(), GetBaseAddressInternal(Request), new WebApiRequestMessage(Request), () => ODataMessageWrapperHelper.Create(readStream, contentHeaders, Request.GetODataContentIdMapping(), Request.GetRequestContainer()), (objectType) => deserializerProvider.GetEdmTypeDeserializer(objectType), (objectType) => deserializerProvider.GetODataDeserializer(objectType, Request), getODataDeserializerContext, (disposable) => Request.RegisterForDispose(disposable), logErrorAction))); } catch (Exception ex) { return(TaskHelpers.FromError <object>(ex)); } }
public override async Task <InputFormatterResult> ReadRequestBodyAsync(InputFormatterContext context, Encoding encoding) { if (context == null) { throw Error.ArgumentNull("context"); } Type type = context.ModelType; if (type == null) { throw Error.ArgumentNull("type"); } HttpRequest request = context.HttpContext.Request; if (request == null) { throw Error.InvalidOperation(SRResources.ReadFromStreamAsyncMustHaveRequest); } // If content length is 0 then return default value for this type RequestHeaders contentHeaders = request.GetTypedHeaders(); object defaultValue = GetDefaultValueForType(type); if (contentHeaders == null || contentHeaders.ContentLength == 0) { return(InputFormatterResult.Success(defaultValue)); } try { Func <ODataDeserializerContext> getODataDeserializerContext = () => { return(new ODataDeserializerContext { Request = request, }); }; Action <Exception> logErrorAction = (ex) => { ILogger logger = context.HttpContext.RequestServices.GetService <ILogger>(); if (logger == null) { throw ex; } logger.LogError(ex, String.Empty); }; List <IDisposable> toDispose = new List <IDisposable>(); ODataDeserializerProvider deserializerProvider = request.GetRequestContainer().GetRequiredService <ODataDeserializerProvider>(); object result = await ODataInputFormatterHelper.ReadFromStreamAsync( type, defaultValue, request.GetModel(), GetBaseAddressInternal(request), new WebApiRequestMessage(request), () => ODataMessageWrapperHelper.Create(new StreamWrapper(request.Body), request.Headers, request.GetODataContentIdMapping(), request.GetRequestContainer()), (objectType) => deserializerProvider.GetEdmTypeDeserializer(objectType), (objectType) => deserializerProvider.GetODataDeserializer(objectType, request), getODataDeserializerContext, (disposable) => toDispose.Add(disposable), logErrorAction); foreach (IDisposable obj in toDispose) { obj.Dispose(); } return(InputFormatterResult.Success(result)); } catch (Exception ex) { context.ModelState.AddModelError(context.ModelName, ex, context.Metadata); return(InputFormatterResult.Failure()); } }