public void PrimitiveTypesSerializeAsOData(string typeString, Type valueType, object value) { string expected = BaselineResource.ResourceManager.GetString(typeString); Assert.NotNull(expected); ODataConventionModelBuilder modelBuilder = new ODataConventionModelBuilder(); modelBuilder.EntitySet <WorkItem>("WorkItems"); IEdmModel model = modelBuilder.GetEdmModel(); HttpConfiguration configuration = new HttpConfiguration(); HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "http://localhost/WorkItems(10)/ID"); request.Properties[HttpPropertyKeys.HttpConfigurationKey] = configuration; request.Properties["MS_ODataPath"] = new DefaultODataPathHandler(model).Parse("WorkItems(10)/ID"); ODataMediaTypeFormatter formatter = CreateFormatter(model, request); Type type = (value != null) ? value.GetType() : typeof(Nullable <int>); ObjectContent content = new ObjectContent(type, value, formatter); var result = content.ReadAsStringAsync().Result; Assert.Xml.Equal(result, expected); }
/// <summary> /// Initializes a new instance of the <see cref="ODataMediaTypeFormatter"/> class. /// </summary> /// <param name="formatter">The <see cref="ODataMediaTypeFormatter"/> to copy settings from.</param> /// <param name="version">The OData version that this formatter supports.</param> /// <param name="request">The <see cref="HttpRequestMessage"/> for the per-request formatter instance.</param> /// <remarks>This is a copy constructor to be used in <see cref="GetPerRequestFormatterInstance"/>.</remarks> internal ODataMediaTypeFormatter(ODataMediaTypeFormatter formatter, ODataVersion version, HttpRequestMessage request) : base(formatter) { if (request == null) { throw Error.ArgumentNull("request"); } Contract.Assert(formatter._serializerProvider != null); Contract.Assert(formatter._deserializerProvider != null); Contract.Assert(formatter._payloadKinds != null); // Parameter 1: formatter // Execept for the other two parameters, this constructor is a copy constructor, and we need to copy // everything on the other instance. // Copy this class's private fields and internal properties. _serializerProvider = formatter._serializerProvider; _deserializerProvider = formatter._deserializerProvider; _payloadKinds = formatter._payloadKinds; MessageWriterSettings = formatter.MessageWriterSettings; MessageReaderSettings = formatter.MessageReaderSettings; // Parameter 2: version _version = version; // Parameter 3: request Request = request; }
private static ODataMediaTypeFormatter CreateApplicationAtomSvcXml(ODataSerializerProvider serializerProvider, ODataDeserializerProvider deserializerProvider) { ODataMediaTypeFormatter formatter = CreateFormatterWithoutMediaTypes(serializerProvider, deserializerProvider, ODataPayloadKind.ServiceDocument); formatter.SupportedMediaTypes.Add(ODataMediaTypes.ApplicationAtomSvcXml); return(formatter); }
private static ODataMediaTypeFormatter CreateApplicationJson(ODataSerializerProvider serializerProvider, ODataDeserializerProvider deserializerProvider) { ODataMediaTypeFormatter formatter = CreateFormatterWithoutMediaTypes( serializerProvider, deserializerProvider, ODataPayloadKind.Feed, ODataPayloadKind.Entry, ODataPayloadKind.Property, ODataPayloadKind.EntityReferenceLink, ODataPayloadKind.EntityReferenceLinks, ODataPayloadKind.Collection, ODataPayloadKind.ServiceDocument, ODataPayloadKind.Error, ODataPayloadKind.Parameter); // Add minimal metadata as the first media type so it gets used when the request doesn't // ask for a specific content type formatter.SupportedMediaTypes.Add(ODataMediaTypes.ApplicationJsonODataMinimalMetadataStreamingTrue); formatter.SupportedMediaTypes.Add(ODataMediaTypes.ApplicationJsonODataMinimalMetadataStreamingFalse); formatter.SupportedMediaTypes.Add(ODataMediaTypes.ApplicationJsonODataMinimalMetadata); formatter.SupportedMediaTypes.Add(ODataMediaTypes.ApplicationJsonODataFullMetadataStreamingTrue); formatter.SupportedMediaTypes.Add(ODataMediaTypes.ApplicationJsonODataFullMetadataStreamingFalse); formatter.SupportedMediaTypes.Add(ODataMediaTypes.ApplicationJsonODataFullMetadata); formatter.SupportedMediaTypes.Add(ODataMediaTypes.ApplicationJsonODataNoMetadataStreamingTrue); formatter.SupportedMediaTypes.Add(ODataMediaTypes.ApplicationJsonODataNoMetadataStreamingFalse); formatter.SupportedMediaTypes.Add(ODataMediaTypes.ApplicationJsonODataNoMetadata); formatter.SupportedMediaTypes.Add(ODataMediaTypes.ApplicationJsonODataVerbose); formatter.SupportedMediaTypes.Add(ODataMediaTypes.ApplicationJsonStreamingTrue); formatter.SupportedMediaTypes.Add(ODataMediaTypes.ApplicationJsonStreamingFalse); formatter.SupportedMediaTypes.Add(ODataMediaTypes.ApplicationJson); return(formatter); }
private static ODataMediaTypeFormatter CreateFormatterWithoutMediaTypes(ODataSerializerProvider serializerProvider, ODataDeserializerProvider deserializerProvider, params ODataPayloadKind[] payloadKinds) { ODataMediaTypeFormatter formatter = new ODataMediaTypeFormatter(deserializerProvider, serializerProvider, payloadKinds); AddSupportedEncodings(formatter); return(formatter); }
private static ODataMediaTypeFormatter CreateFormatterWithoutMediaTypes(IEdmModel model, params ODataPayloadKind[] payloadKinds) { ODataMediaTypeFormatter formatter = new ODataMediaTypeFormatter(model, payloadKinds); AddSupportedEncodings(formatter); return(formatter); }
private static ODataMediaTypeFormatter CreateRawValue(ODataSerializerProvider serializerProvider, ODataDeserializerProvider deserializerProvider) { ODataMediaTypeFormatter formatter = CreateFormatterWithoutMediaTypes(serializerProvider, deserializerProvider, ODataPayloadKind.Value); formatter.MediaTypeMappings.Add(new ODataPrimitiveValueMediaTypeMapping()); formatter.MediaTypeMappings.Add(new ODataBinaryValueMediaTypeMapping()); return(formatter); }
/// <summary> /// Internal method used for selecting the base address to be used with OData Uris. /// If the consumer has provided a delegate for overriding our default implementation, /// we call that, otherwise we default to existing behavior below. /// </summary> /// <param name="request">The HttpRequestMessage object for the given request.</param> /// <returns>The base address to be used as part of the service root; must terminate with a trailing '/'.</returns> private Uri GetBaseAddressInternal(HttpRequestMessage request) { if (BaseAddressFactory != null) { return(BaseAddressFactory(request)); } return(ODataMediaTypeFormatter.GetDefaultBaseAddress(request)); }
private static ODataMediaTypeFormatter CreateApplicationAtomSvcXml(IEdmModel model) { ODataMediaTypeFormatter formatter = CreateFormatterWithoutMediaTypes( model, ODataPayloadKind.ServiceDocument); formatter.SupportedMediaTypes.Add(ODataMediaTypes.ApplicationAtomSvcXml); return(formatter); }
private static ODataMediaTypeFormatter CreateApplicationAtomXmlTypeFeed(IEdmModel model) { ODataMediaTypeFormatter formatter = CreateFormatterWithoutMediaTypes( model, ODataPayloadKind.Feed); formatter.SupportedMediaTypes.Add(ODataMediaTypes.ApplicationAtomXmlTypeFeed); formatter.SupportedMediaTypes.Add(ODataMediaTypes.ApplicationAtomXml); return(formatter); }
/// <summary> /// Initializes a new instance of the <see cref="ODataMediaTypeFormatter"/> class. /// </summary> /// <param name="formatter">The <see cref="ODataMediaTypeFormatter"/> to copy settings from.</param> /// <param name="version">The OData version that this formatter supports.</param> /// <param name="request">The <see cref="HttpRequestMessage"/> for the per-request formatter instance.</param> /// <remarks>This is a copy constructor to be used in <see cref="GetPerRequestFormatterInstance"/>.</remarks> internal ODataMediaTypeFormatter(ODataMediaTypeFormatter formatter, ODataVersion version, HttpRequestMessage request) { if (formatter == null) { throw Error.ArgumentNull("formatter"); } if (request == null) { throw Error.ArgumentNull("request"); } Contract.Assert(formatter._serializerProvider != null); Contract.Assert(formatter._deserializerProvider != null); Contract.Assert(formatter._payloadKinds != null); // Parameter 1: formatter // Execept for the other two parameters, this constructor is a copy constructor, and we need to copy // everything on the other instance. // Parameter 1A: Copy this class's private fields and internal properties. _serializerProvider = formatter._serializerProvider; _deserializerProvider = formatter._deserializerProvider; _payloadKinds = formatter._payloadKinds; MessageReaderQuotas = formatter.MessageReaderQuotas; MessageWriterQuotas = formatter.MessageWriterQuotas; // Parameter 1B: Copy the base class's properties. foreach (MediaTypeMapping mediaTypeMapping in formatter.MediaTypeMappings) { // MediaTypeMapping doesn't support clone, and its public surface area is immutable anyway. MediaTypeMappings.Add(mediaTypeMapping); } RequiredMemberSelector = formatter.RequiredMemberSelector; foreach (Encoding supportedEncoding in formatter.SupportedEncodings) { // Per-request formatters share the encoding instances with the parent formatter SupportedEncodings.Add(supportedEncoding); } foreach (MediaTypeHeaderValue supportedMediaType in formatter.SupportedMediaTypes) { // Per-request formatters share the media type instances with the parent formatter SupportedMediaTypes.Add(supportedMediaType); } // Parameter 2: version _version = version; // Parameter 3: request Request = request; }
private static ODataMediaTypeFormatter CreateTextXml(IEdmModel model) { ODataMediaTypeFormatter formatter = CreateFormatterWithoutMediaTypes( model, ODataPayloadKind.Property, ODataPayloadKind.EntityReferenceLink, ODataPayloadKind.EntityReferenceLinks, ODataPayloadKind.Collection); formatter.SupportedMediaTypes.Add(ODataMediaTypes.TextXml); return(formatter); }
private static ODataMediaTypeFormatter CreateTextXml(ODataSerializerProvider serializerProvider, ODataDeserializerProvider deserializerProvider) { ODataMediaTypeFormatter formatter = CreateFormatterWithoutMediaTypes( serializerProvider, deserializerProvider, ODataPayloadKind.Property, ODataPayloadKind.EntityReferenceLink, ODataPayloadKind.EntityReferenceLinks, ODataPayloadKind.Collection); formatter.SupportedMediaTypes.Add(ODataMediaTypes.TextXml); return(formatter); }
public void Conditionally_Support_OData_If_Query_String_Present() { ODataMediaTypeFormatter odataFormatter = _serverFormatter; odataFormatter.SupportedMediaTypes.Clear(); odataFormatter.MediaTypeMappings.Add(new ODataMediaTypeMapping(ODataTestUtil.ApplicationAtomMediaTypeWithQuality)); odataFormatter.MediaTypeMappings.Add(new ODataMediaTypeMapping(ODataTestUtil.ApplicationJsonMediaTypeWithQuality)); _config.Formatters.Insert(0, odataFormatter); using (HttpServer host = new HttpServer(_config)) { _client = new HttpClient(host); // this request should return response in OData atom format HttpRequestMessage requestMessage = ODataTestUtil.GenerateRequestMessage(new Uri(baseAddress + "People(10)?format=odata"), isAtom: true); using (HttpResponseMessage response = _client.SendAsync(requestMessage).Result) { Assert.NotNull(response); Assert.Equal(HttpStatusCode.OK, response.StatusCode); Assert.Equal(ODataTestUtil.ApplicationAtomMediaTypeWithQuality.MediaType, response.Content.Headers.ContentType.MediaType); Assert.Equal(ODataTestUtil.Version3NumberString, ODataTestUtil.GetDataServiceVersion(response.Content.Headers)); ODataTestUtil.VerifyResponse(response.Content, BaselineResource.EntryTypePersonAtom); } // this request should return response in OData json format HttpRequestMessage messageWithJsonHeader = ODataTestUtil.GenerateRequestMessage(new Uri(baseAddress + "People(10)?format=odata"), isAtom: false); using (HttpResponseMessage response = _client.SendAsync(messageWithJsonHeader).Result) { Assert.NotNull(response); Assert.Equal(HttpStatusCode.OK, response.StatusCode); Assert.Equal(ODataTestUtil.ApplicationJsonMediaType.MediaType, response.Content.Headers.ContentType.MediaType); Assert.Equal(ODataTestUtil.Version3NumberString, ODataTestUtil.GetDataServiceVersion(response.Content.Headers)); // this request should be handled by OData Json ODataTestUtil.VerifyJsonResponse(response.Content, BaselineResource.EntryTypePersonODataJson); } // when the query string is not present, request should be handled by the regular Json Formatter messageWithJsonHeader = ODataTestUtil.GenerateRequestMessage(new Uri(baseAddress + "People(10)"), isAtom: false); using (HttpResponseMessage response = _client.SendAsync(messageWithJsonHeader).Result) { Assert.NotNull(response); Assert.Equal(HttpStatusCode.OK, response.StatusCode); Assert.Equal(response.Content.Headers.ContentType.MediaType, ODataTestUtil.ApplicationJsonMediaTypeWithQuality.MediaType); Assert.Null(ODataTestUtil.GetDataServiceVersion(response.Content.Headers)); ODataTestUtil.VerifyJsonResponse(response.Content, BaselineResource.EntryTypePersonRegularJson); } } }
private ODataMediaTypeFormatter(ODataMediaTypeFormatter formatter, ODataVersion version, HttpRequestMessage request) { Contract.Assert(formatter._serializerProvider != null); Contract.Assert(formatter._model != null); Contract.Assert(formatter._deserializerProvider != null); Contract.Assert(formatter._payloadKinds != null); Contract.Assert(request != null); // Parameter 1: formatter // Execept for the other two parameters, this constructor is a copy constructor, and we need to copy // everything on the other instance. // Parameter 1A: Copy this class's private fields and internal properties. _serializerProvider = formatter._serializerProvider; _model = formatter._model; _deserializerProvider = formatter._deserializerProvider; _payloadKinds = formatter._payloadKinds; WriteOnly = formatter.WriteOnly; // Parameter 1B: Copy the base class's properties. foreach (MediaTypeMapping mediaTypeMapping in formatter.MediaTypeMappings) { // MediaTypeMapping doesn't support clone, and its public surface area is immutable anyway. MediaTypeMappings.Add(mediaTypeMapping); } RequiredMemberSelector = formatter.RequiredMemberSelector; foreach (Encoding supportedEncoding in formatter.SupportedEncodings) { // Encoding's public surface area is mutable, so clone (and use separate instances) to prevent changes // to one instance from affecting the other. SupportedEncodings.Add((Encoding)supportedEncoding.Clone()); } foreach (MediaTypeHeaderValue supportedMediaType in formatter.SupportedMediaTypes) { // MediaTypeHeaderValue's public surface area is mutable, so clone (and use separate instances) to // prevent changes to one instance from affecting the other. SupportedMediaTypes.Add((MediaTypeHeaderValue)((ICloneable)supportedMediaType).Clone()); } // Parameter 2: version _version = version; // Parameter 3: request _request = request; }
public void DollarMetaData_Works_WithoutAcceptHeader() { HttpServer server = new HttpServer(); ODataMediaTypeFormatter odataFormatter = new ODataMediaTypeFormatter(ODataTestUtil.GetEdmModel()); server.Configuration.Formatters.Insert(0, odataFormatter); server.Configuration.Routes.MapHttpRoute(ODataRouteNames.Metadata, "$metadata", new { Controller = "ODataMetadata", Action = "GetMetadata" }); HttpClient client = new HttpClient(server); var response = client.GetAsync("http://localhost/$metadata").Result; Assert.True(response.IsSuccessStatusCode); Assert.Equal(response.Content.Headers.ContentType.MediaType, "application/xml"); Assert.Contains("<edmx:Edmx", response.Content.ReadAsStringAsync().Result); }
private ODataMediaTypeFormatter(ODataMediaTypeFormatter formatter, ODataVersion version, HttpRequestMessage request) { Contract.Assert(formatter._serializerProvider != null); Contract.Assert(formatter._model != null); Contract.Assert(formatter._deserializerProvider != null); Contract.Assert(formatter._payloadKinds != null); Contract.Assert(request != null); // Parameter 1: formatter // Execept for the other two parameters, this constructor is a copy constructor, and we need to copy // everything on the other instance. // Parameter 1A: Copy this class's private fields. _serializerProvider = formatter._serializerProvider; _model = formatter._model; _deserializerProvider = formatter._deserializerProvider; _payloadKinds = formatter._payloadKinds; // Parameter 1B: Copy the base class's properties. foreach (MediaTypeMapping mediaTypeMapping in formatter.MediaTypeMappings) { // MediaTypeMapping doesn't support clone, and its public surface area is immutable anyway. MediaTypeMappings.Add(mediaTypeMapping); } RequiredMemberSelector = formatter.RequiredMemberSelector; foreach (Encoding supportedEncoding in formatter.SupportedEncodings) { // Encoding's public surface area is mutable, so clone (and use separate instances) to prevent changes // to one instance from affecting the other. SupportedEncodings.Add((Encoding)supportedEncoding.Clone()); } foreach (MediaTypeHeaderValue supportedMediaType in formatter.SupportedMediaTypes) { // MediaTypeHeaderValue's public surface area is mutable, so clone (and use separate instances) to // prevent changes to one instance from affecting the other. SupportedMediaTypes.Add((MediaTypeHeaderValue)((ICloneable)supportedMediaType).Clone()); } // Parameter 2: version _version = version; // Parameter 3: request _request = request; }
public ODataActionTests() { _configuration = new HttpConfiguration(); _model = GetModel(); _formatter = new ODataMediaTypeFormatter(_model); _configuration.Formatters.Clear(); _configuration.Formatters.Insert(0, _formatter); _configuration.Routes.MapHttpRoute(ODataRouteNames.Metadata, "$metadata"); _configuration.Routes.MapHttpRoute(ODataRouteNames.GetById, "{controller}({id})"); _configuration.Routes.MapHttpRoute(ODataRouteNames.InvokeBoundAction, "{controller}({boundId})/{odataAction}"); _server = new HttpServer(_configuration); _client = new HttpClient(_server); }
private static ODataMediaTypeFormatter CreateApplicationXml(IEdmModel model) { ODataMediaTypeFormatter formatter = CreateFormatterWithoutMediaTypes( model, ODataPayloadKind.Property, ODataPayloadKind.EntityReferenceLink, ODataPayloadKind.EntityReferenceLinks, ODataPayloadKind.Collection, ODataPayloadKind.ServiceDocument, ODataPayloadKind.MetadataDocument, ODataPayloadKind.Error); formatter.SupportedMediaTypes.Add(ODataMediaTypes.ApplicationXml); return(formatter); }
public void GetMetadata_Returns_EdmModelFromSetODataFormatter() { IEdmModel model = new EdmModel(); ODataMediaTypeFormatter oDataFormatter = new ODataMediaTypeFormatter(model); HttpConfiguration configuration = new HttpConfiguration(); configuration.SetODataFormatter(oDataFormatter); ODataMetadataController controller = new ODataMetadataController(); controller.Request = new HttpRequestMessage(); controller.Request.Properties[HttpPropertyKeys.HttpConfigurationKey] = configuration; Assert.Equal( model, controller.GetMetadata()); }
public void GetMetadata_Returns_EdmModelFromSetODataFormatter() { IEdmModel model = new EdmModel(); ODataMediaTypeFormatter oDataFormatter = new ODataMediaTypeFormatter(model); HttpConfiguration configuration = new HttpConfiguration(); configuration.Formatters.Insert(0, oDataFormatter); ODataMetadataController controller = new ODataMetadataController(); controller.Request = new HttpRequestMessage(); controller.Request.Properties[HttpPropertyKeys.HttpConfigurationKey] = configuration; IEdmModel responseModel; Assert.True(controller.GetMetadata().TryGetContentValue<IEdmModel>(out responseModel)); Assert.Equal(model, responseModel); }
public void ServiceDocumentWorks_AfterTracingIsEnabled_IfModelIsSetOnConfiguration() { HttpServer server = new HttpServer(); ODataMediaTypeFormatter odataFormatter = new ODataMediaTypeFormatter(ODataTestUtil.GetEdmModel()); server.Configuration.Formatters.Insert(0, odataFormatter); server.Configuration.Routes.MapHttpRoute(ODataRouteNames.ServiceDocument, "", new { Controller = "ODataMetadata", Action = "GetServiceDocument" }); server.Configuration.Services.Replace(typeof(ITraceWriter), new Mock<ITraceWriter>().Object); HttpClient client = new HttpClient(server); var response = client.GetAsync("http://localhost/").Result; Assert.True(response.IsSuccessStatusCode); Assert.Equal(response.Content.Headers.ContentType.MediaType, "application/xml"); Assert.Contains("<workspace>", response.Content.ReadAsStringAsync().Result); }
public void Initialize_DoesNotChangeFormatters_IfODataFormatterAlreadyRegistered() { var config = new HttpConfiguration(); var odataFormatter = new ODataMediaTypeFormatter(Enumerable.Empty<ODataPayloadKind>()); config.Formatters.Add(odataFormatter); int formatterCount = config.Formatters.Count; var controllerSettings = new HttpControllerSettings(config); var controllerDescriptor = new HttpControllerDescriptor(); controllerDescriptor.Configuration = config; new ODataFormattingAttribute().Initialize(controllerSettings, controllerDescriptor); Assert.Same(odataFormatter, controllerSettings.Formatters.OfType<ODataMediaTypeFormatter>().First()); Assert.Equal(formatterCount, controllerSettings.Formatters.Count); }
private static ODataMediaTypeFormatter CreateApplicationXml(ODataSerializerProvider serializerProvider, ODataDeserializerProvider deserializerProvider) { ODataMediaTypeFormatter formatter = CreateFormatterWithoutMediaTypes( serializerProvider, deserializerProvider, ODataPayloadKind.Property, ODataPayloadKind.EntityReferenceLink, ODataPayloadKind.EntityReferenceLinks, ODataPayloadKind.Collection, ODataPayloadKind.ServiceDocument, ODataPayloadKind.MetadataDocument, ODataPayloadKind.Error); formatter.SupportedMediaTypes.Add(ODataMediaTypes.ApplicationXml); return(formatter); }
public InheritanceTests() { _configuration = new HttpConfiguration(); _formatter = new ODataMediaTypeFormatter(GetEdmModel()); _configuration.Formatters.Clear(); _configuration.Formatters.Add(_formatter); _configuration.Routes.MapHttpRoute("default", "{action}", new { Controller = "Inheritance" }); _configuration.Routes.MapHttpRoute(ODataRouteNames.GetById, "{controller}({id})"); _configuration.Routes.MapHttpRoute(ODataRouteNames.Default, "{controller}"); _server = new HttpServer(_configuration); _client = new HttpClient(_server); }
private ODataMediaTypeFormatter(ODataMediaTypeFormatter formatter, ODataVersion version, HttpRequestMessage request) { Contract.Assert(formatter._serializerProvider != null); Contract.Assert(formatter._deserializerProvider != null); Contract.Assert(formatter._payloadKinds != null); Contract.Assert(request != null); // Parameter 1: formatter // Execept for the other two parameters, this constructor is a copy constructor, and we need to copy // everything on the other instance. // Parameter 1A: Copy this class's private fields and internal properties. _serializerProvider = formatter._serializerProvider; _deserializerProvider = formatter._deserializerProvider; _payloadKinds = formatter._payloadKinds; MessageReaderQuotas = formatter.MessageReaderQuotas; MessageWriterQuotas = formatter.MessageWriterQuotas; // Parameter 1B: Copy the base class's properties. foreach (MediaTypeMapping mediaTypeMapping in formatter.MediaTypeMappings) { // MediaTypeMapping doesn't support clone, and its public surface area is immutable anyway. MediaTypeMappings.Add(mediaTypeMapping); } RequiredMemberSelector = formatter.RequiredMemberSelector; foreach (Encoding supportedEncoding in formatter.SupportedEncodings) { // Per-request formatters share the encoding instances with the parent formatter SupportedEncodings.Add(supportedEncoding); } foreach (MediaTypeHeaderValue supportedMediaType in formatter.SupportedMediaTypes) { // Per-request formatters share the media type instances with the parent formatter SupportedMediaTypes.Add(supportedMediaType); } // Parameter 2: version _version = version; // Parameter 3: request _request = request; }
public void PrimitiveTypesSerializeAsOData(Type valueType, object value, MediaTypeHeaderValue mediaType, string resourceName) { string expectedEntity = Resources.GetString(resourceName); Assert.NotNull(expectedEntity); ODataConventionModelBuilder modelBuilder = new ODataConventionModelBuilder(); modelBuilder.EntitySet <WorkItem>("WorkItems"); IEdmModel model = modelBuilder.GetEdmModel(); string actualEntity; using (HttpConfiguration configuration = CreateConfiguration()) using (HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "http://localhost/WorkItems(10)/ID")) { request.SetConfiguration(configuration); IEdmProperty property = model.EntityContainers().Single().EntitySets().Single().ElementType.Properties().First(); request.SetEdmModel(model); request.SetODataPath(new ODataPath(new PropertyAccessPathSegment(property))); request.SetFakeODataRouteName(); ODataMediaTypeFormatter formatter = CreateFormatter(request); formatter.SupportedMediaTypes.Add(mediaType); Type type = (value != null) ? value.GetType() : typeof(Nullable <int>); using (ObjectContent content = new ObjectContent(type, value, formatter)) { actualEntity = content.ReadAsStringAsync().Result; } } bool isJson = resourceName.EndsWith(".json"); if (isJson) { JsonAssert.Equal(expectedEntity, actualEntity); } else { Assert.Xml.Equal(expectedEntity, actualEntity); } }
private static ODataMediaTypeFormatter CreateApplicationJsonODataVerbose(IEdmModel model) { ODataMediaTypeFormatter formatter = CreateFormatterWithoutMediaTypes( model, ODataPayloadKind.Feed, ODataPayloadKind.Entry, ODataPayloadKind.Property, ODataPayloadKind.EntityReferenceLink, ODataPayloadKind.EntityReferenceLinks, ODataPayloadKind.Collection, ODataPayloadKind.ServiceDocument, ODataPayloadKind.Error, ODataPayloadKind.Parameter); formatter.SupportedMediaTypes.Add(ODataMediaTypes.ApplicationJsonODataVerbose); return(formatter); }
public void PrimitiveTypesDeserializeAsOData(string typeString, Type type, object value) { HttpConfiguration configuration = new HttpConfiguration(); ODataConventionModelBuilder model = new ODataConventionModelBuilder(); model.EntitySet<WorkItem>("WorkItems"); HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "http://localhost/WorkItems(10)/ID"); request.Properties[HttpPropertyKeys.HttpConfigurationKey] = configuration; ODataMediaTypeFormatter formatter = new ODataMediaTypeFormatter(model.GetEdmModel()) { Request = request }; ObjectContent content = new ObjectContent(type, value, formatter); var stream = content.ReadAsStreamAsync().Result; Assert.Equal( value, formatter.ReadFromStreamAsync(type, stream, content, new Mock<IFormatterLogger>().Object).Result); }
public void Negotiate_CallGetPerRequestFormatterInstanceFirst() { HttpRequestMessage request = new HttpRequestMessage(); MediaTypeFormatter perRequestFormatter = new ODataMediaTypeFormatter(Enumerable.Empty<ODataPayloadKind>()) { Request = request }; Mock<MediaTypeFormatter> formatter = new Mock<MediaTypeFormatter>(); formatter .Setup(f => f.GetPerRequestFormatterInstance(typeof(void), request, It.IsAny<MediaTypeHeaderValue>())) .Returns(perRequestFormatter); Mock<IContentNegotiator> innerContentNegotiator = new Mock<IContentNegotiator>(); innerContentNegotiator .Setup(n => n.Negotiate(typeof(void), request, It.Is<IEnumerable<MediaTypeFormatter>>(f => f.First() == perRequestFormatter))) .Returns(new ContentNegotiationResult(perRequestFormatter, MediaTypeHeaderValue.Parse("application/json"))); IContentNegotiator contentNegotiator = new PerRequestContentNegotiator(innerContentNegotiator.Object); var negotiationResult = contentNegotiator.Negotiate(typeof(void), request, new MediaTypeFormatter[] { formatter.Object }); Assert.Same(perRequestFormatter, negotiationResult.Formatter); }
public void PrimitiveTypesDeserializeAsOData(Type valueType, object value, MediaTypeHeaderValue mediaType, string resourceName) { string entity = Resources.GetString(resourceName); Assert.NotNull(entity); object expectedValue = value; ODataConventionModelBuilder modelBuilder = new ODataConventionModelBuilder(); modelBuilder.EntitySet <WorkItem>("WorkItems"); IEdmModel model = modelBuilder.GetEdmModel(); object actualValue; using (HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "http://localhost/WorkItems(10)/ID")) { HttpConfiguration config = new HttpConfiguration(); config.Routes.MapODataRoute("default", "", model); request.SetConfiguration(config); request.SetODataRouteName("default"); request.SetEdmModel(model); ODataMediaTypeFormatter formatter = CreateFormatter(request); formatter.SupportedMediaTypes.Add(mediaType); using (StringContent content = new StringContent(entity)) { content.Headers.ContentType = mediaType; using (Stream stream = content.ReadAsStreamAsync().Result) { actualValue = formatter.ReadFromStreamAsync(valueType, stream, content, new Mock <IFormatterLogger>().Object).Result; } } } Assert.Equal(expectedValue, actualValue); }
public void Support_Only_OData_Atom_Format() { ODataMediaTypeFormatter odataFormatter = _serverFormatter; odataFormatter.SupportedMediaTypes.Remove(ODataTestUtil.ApplicationJsonMediaType); _config.Formatters.Insert(0, odataFormatter); using (HttpServer host = new HttpServer(_config)) { _client = new HttpClient(host); HttpRequestMessage requestMessage = new HttpRequestMessage(System.Net.Http.HttpMethod.Get, new Uri(baseAddress + "People(10)")); requestMessage.Headers.Accept.Add(_atomMediaType); requestMessage.Headers.Add("DataServiceVersion", "2.0"); requestMessage.Headers.Add("MaxDataServiceVersion", "3.0"); using (HttpResponseMessage response = _client.SendAsync(requestMessage).Result) { Assert.NotNull(response); Assert.Equal(HttpStatusCode.OK, response.StatusCode); Assert.Equal(response.Content.Headers.ContentType.MediaType, _atomMediaType.MediaType); Assert.Equal(ODataTestUtil.GetDataServiceVersion(response.Content.Headers), ODataTestUtil.Version3NumberString); ODataTestUtil.VerifyResponse(response.Content, BaselineResource.EntryTypePersonAtom); } HttpRequestMessage messageWithJsonHeader = new HttpRequestMessage(System.Net.Http.HttpMethod.Get, new Uri(baseAddress + "People(10)")); messageWithJsonHeader.Headers.Accept.Add(ODataTestUtil.ApplicationJsonMediaTypeWithQuality); messageWithJsonHeader.Headers.Add("DataServiceVersion", "2.0"); messageWithJsonHeader.Headers.Add("MaxDataServiceVersion", "3.0"); using (HttpResponseMessage response = _client.SendAsync(messageWithJsonHeader).Result) { Assert.NotNull(response); Assert.Equal(HttpStatusCode.OK, response.StatusCode); Assert.Equal(response.Content.Headers.ContentType.MediaType, ODataTestUtil.ApplicationJsonMediaTypeWithQuality.MediaType); Assert.Null(ODataTestUtil.GetDataServiceVersion(response.Content.Headers)); ODataTestUtil.VerifyJsonResponse(response.Content, BaselineResource.EntryTypePersonRegularJson); } } }
public void PrimitiveTypesDeserializeAsOData(string typeString, Type type, object value) { HttpConfiguration configuration = new HttpConfiguration(); ODataConventionModelBuilder model = new ODataConventionModelBuilder(); model.EntitySet <WorkItem>("WorkItems"); HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "http://localhost/WorkItems(10)/ID"); request.Properties[HttpPropertyKeys.HttpConfigurationKey] = configuration; ODataMediaTypeFormatter formatter = CreateFormatter(model.GetEdmModel(), request); ObjectContent content = new ObjectContent(type, value, formatter, "application/xml"); var stream = content.ReadAsStreamAsync().Result; Assert.Equal( value, formatter.ReadFromStreamAsync(type, stream, content, new Mock <IFormatterLogger>().Object).Result); }
public void PrimitiveTypesSerializeAsOData(string typeString, Type valueType, object value) { string expected = BaselineResource.ResourceManager.GetString(typeString); Assert.NotNull(expected); ODataConventionModelBuilder model = new ODataConventionModelBuilder(); model.EntitySet<WorkItem>("WorkItems"); HttpConfiguration configuration = new HttpConfiguration(); HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "http://localhost/WorkItems(10)/ID"); request.Properties[HttpPropertyKeys.HttpConfigurationKey] = configuration; ODataMediaTypeFormatter formatter = new ODataMediaTypeFormatter(model.GetEdmModel()) { Request = request }; Type type = (value != null) ? value.GetType() : typeof(Nullable<int>); ObjectContent content = new ObjectContent(type, value, formatter); var result = content.ReadAsStringAsync().Result; Assert.Xml.Equal(result, expected); }
private static ODataMediaTypeFormatter CreateFormatterWithoutMediaTypes(ODataSerializerProvider serializerProvider, ODataDeserializerProvider deserializerProvider, params ODataPayloadKind[] payloadKinds) { ODataMediaTypeFormatter formatter = new ODataMediaTypeFormatter(deserializerProvider, serializerProvider, payloadKinds); AddSupportedEncodings(formatter); return formatter; }
private static ODataMediaTypeFormatter CreateFormatterWithoutMediaTypes(params ODataPayloadKind[] payloadKinds) { ODataMediaTypeFormatter formatter = new ODataMediaTypeFormatter(payloadKinds); AddSupportedEncodings(formatter); return formatter; }
static void Main(string[] args) { Console.WriteLine(typeof(int).BaseType.BaseType); HttpSelfHostServer server = null; try { // Set up server configuration HttpSelfHostConfiguration configuration = new HttpSelfHostConfiguration(_baseAddress); configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Never; // Generate a model IEdmModel model = GetEdmModel(); // Create the OData formatter and give it the model ODataMediaTypeFormatter odataFormatter = new ODataMediaTypeFormatter(model); configuration.Formatters.Clear(); configuration.SetODataFormatter(odataFormatter); // Metadata routes to support $metadata and code generation in the WCF Data Service client. configuration.Routes.MapHttpRoute(ODataRouteNames.Metadata, "$metadata", new { Controller = "ODataMetadata", Action = "GetMetadata" }); configuration.Routes.MapHttpRoute(ODataRouteNames.ServiceDocument, "", new { Controller = "ODataMetadata", Action = "GetServiceDocument" }); // Relationship routes (notice the parameters is {type}Id not id, this avoids colliding with GetById(id)). configuration.Routes.MapHttpRoute(ODataRouteNames.PropertyNavigation, "{controller}({parentId})/{navigationProperty}"); // Route for manipulating links. //configuration.Routes.MapHttpRoute(ODataRouteNames.Link, "{controller}({id})/$links/Products"); configuration.Routes.MapHttpRoute(ODataRouteNames.Link, "{controller}({id})/$links/{navigationProperty}"); // Routes for urls both producing and handling urls like ~/Product(1), ~/Products() and ~/Products configuration.Routes.MapHttpRoute(ODataRouteNames.GetById, "{controller}({id})"); configuration.Routes.MapHttpRoute(ODataRouteNames.DefaultWithParentheses, "{controller}()"); configuration.Routes.MapHttpRoute(ODataRouteNames.Default, "{controller}"); // Create server server = new HttpSelfHostServer(configuration); // Start listening server.OpenAsync().Wait(); Console.WriteLine("Listening on " + _baseAddress); } catch (Exception e) { Console.WriteLine("Could not start server: {0}", e.GetBaseException().Message); } finally { Console.WriteLine("Hit ENTER to exit..."); Console.ReadLine(); if (server != null) { // Stop listening server.CloseAsync().Wait(); } } }
/// <summary> /// Sets the given <see cref="ODataMediaTypeFormatter"/> on the configuration and adds it to the formatter collection. /// </summary> /// <param name="configuration">Configuration to be updated.</param> /// <param name="formatter">The <see cref="ODataMediaTypeFormatter"/> to update.</param> public static void SetODataFormatter(this HttpConfiguration configuration, ODataMediaTypeFormatter formatter) { if (configuration == null) { throw Error.ArgumentNull("configuration"); } if (formatter == null) { throw Error.ArgumentNull("formatter"); } if (configuration.GetODataFormatter() != null || configuration.Formatters.OfType<ODataMediaTypeFormatter>().Any()) { throw Error.NotSupported(SRResources.ResetODataFormatterNotSupported, typeof(ODataMediaTypeFormatter).Name, typeof(HttpConfiguration).Name); } else if (configuration.GetEdmModel() != null && configuration.GetEdmModel() != formatter.Model) { throw Error.NotSupported( SRResources.EdmModelOnConfigurationMismatch, typeof(IEdmModel).Name, typeof(ODataMediaTypeFormatter).Name, "SetODataFormatter"); } else { // This is a workaround for Bug 464640 where the formatter tracer wraps on to the formatter and there is no // easy way to retrieve the ODataFormatter from configuration afterwards. configuration.SetEdmModel(formatter.Model); configuration.Properties.TryAdd(ODataFormatterKey, formatter); configuration.Formatters.Insert(0, formatter); } }