private void WriteResponseBody(OutputFormatterWriteContext context) { HttpRequest request = context.HttpContext.Request; HttpResponse response = context.HttpContext.Response; IEdmModel model = request.ODataProperties().Model; if (model == null) { throw Error.InvalidOperation(SRResources.RequestMustHaveModel); } object value = context.Object; Type type = value.GetType(); ODataSerializer serializer = GetSerializer(type, value, model, new DefaultODataSerializerProvider(), request); IUrlHelper urlHelper = context.HttpContext.UrlHelper(); ODataPath path = request.ODataProperties().Path; IEdmNavigationSource targetNavigationSource = path == null ? null : path.NavigationSource; string preferHeader = RequestPreferenceHelpers.GetRequestPreferHeader(request); string annotationFilter = null; if (!String.IsNullOrEmpty(preferHeader)) { ODataMessageWrapper messageWrapper = new ODataMessageWrapper(response.Body, response.Headers); messageWrapper.SetHeader(RequestPreferenceHelpers.PreferHeaderName, preferHeader); annotationFilter = messageWrapper.PreferHeader().AnnotationFilter; } IODataResponseMessage responseMessage = new ODataMessageWrapper(response.Body, response.Headers); if (annotationFilter != null) { responseMessage.PreferenceAppliedHeader().AnnotationFilter = annotationFilter; } Uri baseAddress = GetBaseAddress(request); ODataMessageWriterSettings writerSettings = new ODataMessageWriterSettings(_messageWriterSettings) { PayloadBaseUri = baseAddress, Version = ODataProperties.DefaultODataVersion, }; string metadataLink = urlHelper.CreateODataLink(new MetadataPathSegment()); if (metadataLink == null) { throw new SerializationException(SRResources.UnableToDetermineMetadataUrl); } writerSettings.ODataUri = new ODataUri { ServiceRoot = baseAddress, // TODO: 1604 Convert webapi.odata's ODataPath to ODL's ODataPath, or use ODL's ODataPath. SelectAndExpand = request.ODataProperties().SelectExpandClause, Path = (path == null || IsOperationPath(path)) ? null : path.ODLPath, }; using (ODataMessageWriter messageWriter = new ODataMessageWriter(responseMessage, writerSettings, model)) { ODataSerializerContext writeContext = new ODataSerializerContext() { Request = request, RequestContext = request.HttpContext, Url = urlHelper, NavigationSource = targetNavigationSource, Model = model, RootElementName = GetRootElementName(path) ?? "root", SkipExpensiveAvailabilityChecks = serializer.ODataPayloadKind == ODataPayloadKind.Feed, Path = path, MetadataLevel = ODataMediaTypes.GetMetadataLevel(new MediaTypeHeaderValue(context.ContentType.Value)), SelectExpandClause = request.ODataProperties().SelectExpandClause }; serializer.WriteObject(value, type, messageWriter, writeContext); } }
public async Task WriteJson(object value, Stream writeStream) { IEdmModel model = _odataProperties.Model; if (model == null) { throw new Exception("Microsoft.OData.Edm.Error.InvalidOperation(SRResources.RequestMustHaveModel)"); } var type = value.GetType(); type = _context.ObjectType; var pageResult = value as PageResult <object>; if (pageResult != null) { //value = pageResult.Items; type = pageResult.Items.GetType(); } var urlHelper = UrlHelper(_context.HttpContext); var path = Request.ODataFeature().Path; IEdmNavigationSource targetNavigationSource = path?.NavigationSource; // serialize a response //HttpConfiguration configuration = Request.GetConfiguration(); //if (configuration == null) //{ // throw Error.InvalidOperation(SRResources.RequestMustContainConfiguration); //} // TODO: Fix this ffs... string preferHeader = RequestPreferenceHelpers.GetRequestPreferHeader(Request); string annotationFilter = null; if (ODataCountMediaTypeMapping.IsCountRequest(Request.HttpContext)) { Response.ContentType = "text/plain"; } if (!String.IsNullOrEmpty(preferHeader)) { ODataMessageWrapper messageWrapper = new ODataMessageWrapper(writeStream, Response.Headers); messageWrapper.SetHeader(RequestPreferenceHelpers.PreferHeaderName, preferHeader); annotationFilter = messageWrapper.PreferHeader().AnnotationFilter; } IODataResponseMessage responseMessage = new ODataMessageWrapper(writeStream, Response.Headers); if (annotationFilter != null) { responseMessage.PreferenceAppliedHeader().AnnotationFilter = annotationFilter; } Uri baseAddress = GetBaseAddress(); ODataMessageWriterSettings writerSettings = new ODataMessageWriterSettings() { BaseUri = baseAddress, Version = _version, //MessageWriterSettings }; writerSettings.ODataUri = new ODataUri { ServiceRoot = baseAddress, // TODO: 1604 Convert webapi.odata's ODataPath to ODL's ODataPath, or use ODL's ODataPath. SelectAndExpand = Request.ODataFeature().SelectExpandClause, // TODO: Support $apply //Apply = Request.ODataFeature().ApplyClause, Path = (path == null || IsOperationPath(path)) ? null : path.ODLPath, }; MediaTypeHeaderValue contentType = null; // TODO: Restore //if (contentHeaders != null && contentHeaders.ContentType != null) //{ // contentType = contentHeaders.ContentType; //} using (ODataMessageWriter messageWriter = new ODataMessageWriter(responseMessage, writerSettings, model)) { ODataSerializer serializer = GetSerializer(type, value, model, _context.HttpContext.RequestServices.GetService <IODataSerializerProvider>()); ODataSerializerContext writeContext = new ODataSerializerContext() { Context = _context.HttpContext, Url = urlHelper, NavigationSource = targetNavigationSource, Model = model, RootElementName = GetRootElementName(path) ?? "root", SkipExpensiveAvailabilityChecks = serializer.ODataPayloadKind == ODataPayloadKind.Collection, Path = path, MetadataLevel = ODataMediaTypes.GetMetadataLevel(contentType), SelectExpandClause = Request.ODataFeature().SelectExpandClause }; await serializer.WriteObjectAsync(value, type, messageWriter, writeContext); } }
private void WriteResponseBody(OutputFormatterWriteContext context) { HttpContext httpContext = context.HttpContext; HttpRequest request = context.HttpContext.Request; HttpResponse response = context.HttpContext.Response; IEdmModel model = context.HttpContext.ODataFeature().Model; if (model == null) { throw Error.InvalidOperation(SRResources.RequestMustHaveModel); } object value = null; object graph = null; var objectResult = context.Object as PageResult <object>; if (objectResult != null) { value = objectResult.Items; graph = objectResult; } else { value = context.Object; graph = value; } var type = value.GetType(); ODataSerializer serializer = GetSerializer(type, value, context); IUrlHelper urlHelper = context.HttpContext.UrlHelper(); ODataPath path = httpContext.ODataFeature().Path; IEdmNavigationSource targetNavigationSource = path == null ? null : path.NavigationSource; string preferHeader = RequestPreferenceHelpers.GetRequestPreferHeader(request); string annotationFilter = null; if (!String.IsNullOrEmpty(preferHeader)) { ODataMessageWrapper messageWrapper = new ODataMessageWrapper(response.Body, response.Headers); messageWrapper.SetHeader(RequestPreferenceHelpers.PreferHeaderName, preferHeader); annotationFilter = messageWrapper.PreferHeader().AnnotationFilter; } IODataResponseMessage responseMessage = new ODataMessageWrapper(response.Body, response.Headers); if (annotationFilter != null) { responseMessage.PreferenceAppliedHeader().AnnotationFilter = annotationFilter; } Uri baseAddress = GetBaseAddress(request); ODataMessageWriterSettings writerSettings = _messageWriterSettings.Clone(); writerSettings.BaseUri = baseAddress; writerSettings.Version = ODataVersion.V4; writerSettings.Validations = writerSettings.Validations & ~ValidationKinds.ThrowOnUndeclaredPropertyForNonOpenType; string metadataLink = urlHelper.CreateODataLink(request, MetadataSegment.Instance); if (metadataLink == null) { throw new SerializationException(SRResources.UnableToDetermineMetadataUrl); } writerSettings.ODataUri = new ODataUri { ServiceRoot = baseAddress, // TODO: 1604 Convert webapi.odata's ODataPath to ODL's ODataPath, or use ODL's ODataPath. SelectAndExpand = httpContext.ODataFeature().SelectExpandClause, Path = (path == null) ? null : path.ODLPath //Path = (path == null || IsOperationPath(path)) ? null : path.ODLPath, }; using (ODataMessageWriter messageWriter = new ODataMessageWriter(responseMessage, writerSettings, model)) { ODataSerializerContext writeContext = new ODataSerializerContext() { Context = context.HttpContext, Url = urlHelper, NavigationSource = targetNavigationSource, Model = model, RootElementName = GetRootElementName(path) ?? "root", SkipExpensiveAvailabilityChecks = serializer.ODataPayloadKind == ODataPayloadKind.ResourceSet, Path = path, MetadataLevel = ODataMediaTypes.GetMetadataLevel(MediaTypeHeaderValue.Parse(context.ContentType.Value)), SelectExpandClause = request.ODataFeature().SelectExpandClause, }; serializer.WriteObject(graph, type, messageWriter, writeContext); } }
public async Task WriteJson(object value, Stream writeStream) { IEdmModel model = _odataProperties.Model; if (model == null) { throw Error.InvalidOperation(SRResources.RequestMustHaveModel); } var type = value.GetType(); type = _context.ObjectType; var urlHelper = UrlHelper(_context.HttpContext); ODataPath path = Request.ODataProperties().Path; IEdmNavigationSource targetNavigationSource = path == null ? null : path.NavigationSource; // serialize a response //HttpConfiguration configuration = Request.GetConfiguration(); //if (configuration == null) //{ // throw Error.InvalidOperation(SRResources.RequestMustContainConfiguration); //} // TODO: Fix this ffs... string preferHeader = RequestPreferenceHelpers.GetRequestPreferHeader(Request); string annotationFilter = null; if (ODataCountMediaTypeMapping.IsCountRequest(Request)) { Response.ContentType = "text/plain"; } if (!String.IsNullOrEmpty(preferHeader)) { ODataMessageWrapper messageWrapper = new ODataMessageWrapper(writeStream, Response.Headers); messageWrapper.SetHeader(RequestPreferenceHelpers.PreferHeaderName, preferHeader); annotationFilter = messageWrapper.PreferHeader().AnnotationFilter; } IODataResponseMessage responseMessage = new ODataMessageWrapper(writeStream, Response.Headers); if (annotationFilter != null) { responseMessage.PreferenceAppliedHeader().AnnotationFilter = annotationFilter; } Uri baseAddress = GetBaseAddress(); ODataMessageWriterSettings writerSettings = new ODataMessageWriterSettings(MessageWriterSettings) { PayloadBaseUri = baseAddress, Version = _version, }; writerSettings.ODataUri = new ODataUri { ServiceRoot = baseAddress, // TODO: 1604 Convert webapi.odata's ODataPath to ODL's ODataPath, or use ODL's ODataPath. SelectAndExpand = Request.ODataProperties().SelectExpandClause, // TODO: Support $apply //Apply = Request.ODataProperties().ApplyClause, Path = (path == null || IsOperationPath(path)) ? null : path.ODLPath, }; MediaTypeHeaderValue contentType = null; // TODO: Restore //if (contentHeaders != null && contentHeaders.ContentType != null) //{ // contentType = contentHeaders.ContentType; //} using (ODataMessageWriter messageWriter = new ODataMessageWriter(responseMessage, writerSettings, model)) { ODataSerializer serializer = GetSerializer(type, value, model, _context.HttpContext.RequestServices.GetService<ODataSerializerProvider>()); ODataSerializerContext writeContext = new ODataSerializerContext() { Request = Request, RequestContext = _context.HttpContext, Url = urlHelper, NavigationSource = targetNavigationSource, Model = model, RootElementName = GetRootElementName(path) ?? "root", SkipExpensiveAvailabilityChecks = serializer.ODataPayloadKind == ODataPayloadKind.Feed, Path = path, MetadataLevel = ODataMediaTypes.GetMetadataLevel(contentType), SelectExpandClause = Request.ODataProperties().SelectExpandClause }; await serializer.WriteObjectAsync(value, type, messageWriter, writeContext); } }
private void WriteResponseBody(OutputFormatterWriteContext context) { HttpRequest request = context.HttpContext.Request; HttpResponse response = context.HttpContext.Response; IEdmModel model = request.ODataProperties().Model; if (model == null) { throw Error.InvalidOperation(SRResources.RequestMustHaveModel); } object value = context.Object; Type type = value.GetType(); ODataSerializer serializer = GetSerializer(type, value, model, context.HttpContext.RequestServices.GetService<ODataSerializerProvider>(), request); IUrlHelper urlHelper = context.HttpContext.UrlHelper(); ODataPath path = request.ODataProperties().Path; IEdmNavigationSource targetNavigationSource = path == null ? null : path.NavigationSource; string preferHeader = RequestPreferenceHelpers.GetRequestPreferHeader(request); string annotationFilter = null; if (!String.IsNullOrEmpty(preferHeader)) { ODataMessageWrapper messageWrapper = new ODataMessageWrapper(response.Body, response.Headers); messageWrapper.SetHeader(RequestPreferenceHelpers.PreferHeaderName, preferHeader); annotationFilter = messageWrapper.PreferHeader().AnnotationFilter; } IODataResponseMessage responseMessage = new ODataMessageWrapper(response.Body, response.Headers); if (annotationFilter != null) { responseMessage.PreferenceAppliedHeader().AnnotationFilter = annotationFilter; } Uri baseAddress = GetBaseAddress(request); ODataMessageWriterSettings writerSettings = new ODataMessageWriterSettings(_messageWriterSettings) { PayloadBaseUri = baseAddress, Version = ODataProperties.DefaultODataVersion, }; string metadataLink = urlHelper.CreateODataLink(new MetadataPathSegment()); if (metadataLink == null) { throw new SerializationException(SRResources.UnableToDetermineMetadataUrl); } writerSettings.ODataUri = new ODataUri { ServiceRoot = baseAddress, // TODO: 1604 Convert webapi.odata's ODataPath to ODL's ODataPath, or use ODL's ODataPath. SelectAndExpand = request.ODataProperties().SelectExpandClause, Path = (path == null || IsOperationPath(path)) ? null : path.ODLPath, }; using (ODataMessageWriter messageWriter = new ODataMessageWriter(responseMessage, writerSettings, model)) { ODataSerializerContext writeContext = new ODataSerializerContext() { Request = request, RequestContext = request.HttpContext, Url = urlHelper, NavigationSource = targetNavigationSource, Model = model, RootElementName = GetRootElementName(path) ?? "root", SkipExpensiveAvailabilityChecks = serializer.ODataPayloadKind == ODataPayloadKind.Feed, Path = path, MetadataLevel = ODataMediaTypes.GetMetadataLevel(new MediaTypeHeaderValue(context.ContentType.Value)), SelectExpandClause = request.ODataProperties().SelectExpandClause }; serializer.WriteObjectAsync(value, type, messageWriter, writeContext); } }
private void WriteResponseBody(OutputFormatterWriteContext context) { HttpContext httpContext = context.HttpContext; HttpRequest request = context.HttpContext.Request; HttpResponse response = context.HttpContext.Response; IEdmModel model = context.HttpContext.ODataFeature().Model; if (model == null) { throw Error.InvalidOperation(SRResources.RequestMustHaveModel); } object value = null; object graph = null; var objectResult = context.Object as PageResult <object>; if (objectResult != null) { value = objectResult.Items; graph = objectResult; } else { value = context.Object; graph = value; } var type = value.GetType(); ODataSerializer serializer = GetSerializer(type, value, context); IUrlHelper urlHelper = context.HttpContext.UrlHelper(); ODataPath path = httpContext.ODataFeature().Path; IEdmNavigationSource targetNavigationSource = path == null ? null : path.NavigationSource; string preferHeader = RequestPreferenceHelpers.GetRequestPreferHeader(request); string annotationFilter = null; if (!String.IsNullOrEmpty(preferHeader)) { ODataMessageWrapper messageWrapper = new ODataMessageWrapper(response.Body, response.Headers); messageWrapper.SetHeader(RequestPreferenceHelpers.PreferHeaderName, preferHeader); annotationFilter = messageWrapper.PreferHeader().AnnotationFilter; } IODataResponseMessage responseMessage = new ODataMessageWrapper(response.Body, response.Headers); if (annotationFilter != null) { responseMessage.PreferenceAppliedHeader().AnnotationFilter = annotationFilter; } Uri baseAddress = GetBaseAddress(request); ODataMessageWriterSettings writerSettings = _messageWriterSettings.Clone(); writerSettings.BaseUri = baseAddress; writerSettings.Version = ODataVersion.V4; writerSettings.Validations = writerSettings.Validations & ~ValidationKinds.ThrowOnUndeclaredPropertyForNonOpenType; string metadataLink = urlHelper.CreateODataLink(request, MetadataSegment.Instance); if (metadataLink == null) { throw new SerializationException(SRResources.UnableToDetermineMetadataUrl); } writerSettings.ODataUri = new ODataUri { ServiceRoot = baseAddress, // TODO: 1604 Convert webapi.odata's ODataPath to ODL's ODataPath, or use ODL's ODataPath. SelectAndExpand = httpContext.ODataFeature().SelectExpandClause, Path = (path == null) ? null : path.ODLPath //Path = (path == null || IsOperationPath(path)) ? null : path.ODLPath, }; #region 为OData添加缓存 使用的EF二级缓存 这里是先从缓存获取数据 //var queryResult = graph as IQueryable; //PageResult<object> target = null; //if (queryResult == null) //{ // target = graph as PageResult<object>; // if (target != null) queryResult = target.Items.AsQueryable(); //} //var isReadCache = queryResult != null || target != null; //var cacheValue = isReadCache?queryResult.CacheResult(context.HttpContext.RequestServices):null; //if (isReadCache&&target != null && cacheValue != null) //{ // var pageResult = cacheValue as IEnumerable<object>; // //long? count = target.Count.HasValue ? (long?)pageResult.LongCount() : null; // cacheValue = new PageResult<object>(pageResult, null, target.Count); //} //if (isReadCache&&cacheValue != null) graph = cacheValue; #endregion using (ODataMessageWriter messageWriter = new ODataMessageWriter(responseMessage, writerSettings, model)) { ODataSerializerContext writeContext = new ODataSerializerContext() { Context = context.HttpContext, Url = urlHelper, NavigationSource = targetNavigationSource, Model = model, RootElementName = GetRootElementName(path) ?? "root", SkipExpensiveAvailabilityChecks = serializer.ODataPayloadKind == ODataPayloadKind.ResourceSet, Path = path, MetadataLevel = ODataMediaTypes.GetMetadataLevel(MediaTypeHeaderValue.Parse(context.ContentType.Value)), SelectExpandClause = request.ODataFeature().SelectExpandClause, }; serializer.WriteObject(graph, type, messageWriter, writeContext); #region 这里是往缓存中 存储数据 //if (isReadCache&&cacheValue == null) //{ // writeContext.Context.Response.Body.Position = 0; // StreamReader reder = new StreamReader(writeContext.Context.Response.Body); // var bodyStr = reder.ReadToEnd(); // JObject.Parse(bodyStr).TryGetValue("value",out JToken values); // cacheValue = values.ToObject(type.MarkListType()); // queryResult.CacheQuerable(cacheValue, writeContext.Context.RequestServices); //} #endregion } }