コード例 #1
0
ファイル: RequestWriter.cs プロジェクト: GGZORR/OdataSample
        protected override async Task <Stream> WriteActionContentAsync(string method, string commandText, string actionName, IDictionary <string, object> parameters)
        {
            IODataRequestMessageAsync message = IsBatch
                ? await CreateBatchOperationMessageAsync(method, null, null, commandText, true)
                                                .ConfigureAwait(false) : new ODataRequestMessage();

            using (var messageWriter = new ODataMessageWriter(message, GetWriterSettings(), _model))
            {
                var action = _model.SchemaElements.BestMatch(
                    x => x.SchemaElementKind == EdmSchemaElementKind.Action,
                    x => x.Name, actionName, _session.Pluralizer) as IEdmAction;
                var parameterWriter = await messageWriter.CreateODataParameterWriterAsync(action).ConfigureAwait(false);

                await parameterWriter.WriteStartAsync().ConfigureAwait(false);

                foreach (var parameter in parameters)
                {
                    var operationParameter = action.Parameters.BestMatch(x => x.Name, parameter.Key, _session.Pluralizer);
                    if (operationParameter == null)
                    {
                        throw new UnresolvableObjectException(parameter.Key, string.Format("Parameter [{0}] not found for action [{1}]", parameter.Key, actionName));
                    }

                    await WriteOperationParameterAsync(parameterWriter, operationParameter, parameter.Key, parameter.Value).ConfigureAwait(false);
                }

                await parameterWriter.WriteEndAsync().ConfigureAwait(false);

                return(IsBatch ? null : await message.GetStreamAsync().ConfigureAwait(false));
            }
        }
コード例 #2
0
        protected override async Task <Stream> WriteActionContentAsync(string method, string commandText, string actionName, IDictionary <string, object> parameters)
        {
#if SILVERLIGHT
            IODataRequestMessage
#else
            IODataRequestMessageAsync
#endif
            message = IsBatch
                ? await CreateBatchOperationMessageAsync(method, null, null, commandText, true)
                      .ConfigureAwait(false) : new ODataRequestMessage();

            using (var messageWriter = new ODataMessageWriter(message, GetWriterSettings(ODataFormat.Json), _model))
            {
                var action = _model.SchemaElements
                             .Where(x => x.SchemaElementKind == EdmSchemaElementKind.EntityContainer)
                             .SelectMany(x => (x as IEdmEntityContainer).FunctionImports())
                             .BestMatch(x => x.Name, actionName, _session.Pluralizer);
#if SILVERLIGHT
                var parameterWriter = messageWriter.CreateODataParameterWriter(action);
                parameterWriter.WriteStart();
#else
                var parameterWriter = await messageWriter.CreateODataParameterWriterAsync(action).ConfigureAwait(false);

                await parameterWriter.WriteStartAsync().ConfigureAwait(false);
#endif


                foreach (var parameter in parameters)
                {
                    var operationParameter = action.Parameters.BestMatch(x => x.Name, parameter.Key, _session.Pluralizer);
                    if (operationParameter == null)
                    {
                        throw new UnresolvableObjectException(parameter.Key, string.Format("Parameter [{0}] not found for action [{1}]", parameter.Key, actionName));
                    }

#if SILVERLIGHT
                    WriteOperationParameter(parameterWriter, operationParameter, parameter.Key, parameter.Value);
#else
                    await WriteOperationParameterAsync(parameterWriter, operationParameter, parameter.Key, parameter.Value).ConfigureAwait(false);
#endif
                }

#if SILVERLIGHT
                parameterWriter.WriteEnd();
#else
                await parameterWriter.WriteEndAsync().ConfigureAwait(false);
#endif

                if (IsBatch)
                {
                    return(null);
                }

#if SILVERLIGHT
                return(message.GetStream());
#else
                return(await message.GetStreamAsync().ConfigureAwait(false));
#endif
            }
        }
コード例 #3
0
        protected override async Task <Stream> WriteActionContentAsync(string method, string commandText, string actionName, string boundTypeName, IDictionary <string, object> parameters)
        {
            var message = IsBatch
                ? await CreateBatchOperationMessageAsync(method, null, null, commandText, true).ConfigureAwait(false)
                : new ODataRequestMessage();

            using (var messageWriter = new ODataMessageWriter(message, GetWriterSettings(), _model))
            {
                Func <IEdmOperationParameter, IEdmType, bool> typeMatch = (parameter, baseType) =>
                                                                          parameter == null ||
                                                                          parameter.Type.Definition == baseType ||
                                                                          parameter.Type.Definition.TypeKind == EdmTypeKind.Collection &&
                                                                          (parameter.Type.Definition as IEdmCollectionType).ElementType.Definition == baseType;

                var action = boundTypeName == null
                    ? _model.SchemaElements.BestMatch(
                    x => x.SchemaElementKind == EdmSchemaElementKind.Action,
                    x => x.Name, actionName, _session.Settings.NameMatchResolver) as IEdmAction
                    : _model.SchemaElements.BestMatch(
                    x => x.SchemaElementKind == EdmSchemaElementKind.Action &&
                    typeMatch(
                        ((IEdmAction)x).Parameters.FirstOrDefault(p => p.Name == "bindingParameter"),
                        _model.FindDeclaredType(boundTypeName)),
                    x => x.Name, actionName, _session.Settings.NameMatchResolver) as IEdmAction;

                var parameterWriter = await messageWriter.CreateODataParameterWriterAsync(action).ConfigureAwait(false);

                await parameterWriter.WriteStartAsync().ConfigureAwait(false);

                foreach (var parameter in parameters)
                {
                    var operationParameter = action.Parameters.BestMatch(x => x.Name, parameter.Key, _session.Settings.NameMatchResolver);
                    if (operationParameter == null)
                    {
                        throw new UnresolvableObjectException(parameter.Key, $"Parameter [{parameter.Key}] not found for action [{actionName}]");
                    }

                    await WriteOperationParameterAsync(parameterWriter, operationParameter, parameter.Key, parameter.Value).ConfigureAwait(false);
                }

                await parameterWriter.WriteEndAsync().ConfigureAwait(false);

                return(IsBatch ? null : await message.GetStreamAsync().ConfigureAwait(false));
            }
        }
コード例 #4
0
        protected override async Task <Stream> WriteActionContentAsync(string method, string commandText, string actionName, string boundTypeName, IDictionary <string, object> parameters)
        {
            IODataRequestMessageAsync message = IsBatch
                ? await CreateBatchOperationMessageAsync(method, null, null, commandText, true).ConfigureAwait(false)
                : new ODataRequestMessage();

            using (var messageWriter = new ODataMessageWriter(message, GetWriterSettings(ODataFormat.Json), _model))
            {
                var action = _model.SchemaElements
                             .Where(x => x.SchemaElementKind == EdmSchemaElementKind.EntityContainer)
                             .SelectMany(x => (x as IEdmEntityContainer).FunctionImports())
                             .BestMatch(x => x.Name, actionName, _session.Settings.NameMatchResolver);
                var parameterWriter = await messageWriter.CreateODataParameterWriterAsync(action).ConfigureAwait(false);

                await parameterWriter.WriteStartAsync().ConfigureAwait(false);


                foreach (var parameter in parameters)
                {
                    var operationParameter = action.Parameters.BestMatch(x => x.Name, parameter.Key, _session.Settings.NameMatchResolver);
                    if (operationParameter == null)
                    {
                        throw new UnresolvableObjectException(parameter.Key, $"Parameter [{parameter.Key}] not found for action [{actionName}]");
                    }

                    await WriteOperationParameterAsync(parameterWriter, operationParameter, parameter.Key, parameter.Value).ConfigureAwait(false);
                }

                await parameterWriter.WriteEndAsync().ConfigureAwait(false);

                if (IsBatch)
                {
                    return(null);
                }

                return(await message.GetStreamAsync().ConfigureAwait(false));
            }
        }
コード例 #5
0
        protected override async Task <Stream> WriteActionContentAsync(string actionName, IDictionary <string, object> parameters)
        {
            var message = new ODataRequestMessage();

            using (var messageWriter = new ODataMessageWriter(message, GetWriterSettings(), _model))
            {
                var action = _model.SchemaElements.BestMatch(
                    x => x.SchemaElementKind == EdmSchemaElementKind.Action,
                    x => x.Name, actionName, _session.Pluralizer);
                var parameterWriter = await messageWriter.CreateODataParameterWriterAsync(action as IEdmAction);

                await parameterWriter.WriteStartAsync();

                foreach (var parameter in parameters)
                {
                    if (!(parameter.Value is string) && parameter.Value is IEnumerable)
                    {
                        var collectionWriter = await parameterWriter.CreateCollectionWriterAsync(parameter.Key);

                        await collectionWriter.WriteStartAsync(new ODataCollectionStart());

                        foreach (var item in parameter.Value as IEnumerable)
                        {
                            await collectionWriter.WriteItemAsync(item);
                        }
                        await collectionWriter.WriteEndAsync();
                    }
                    else
                    {
                        await parameterWriter.WriteValueAsync(parameter.Key, parameter.Value);
                    }
                }

                await parameterWriter.WriteEndAsync();

                return(await message.GetStreamAsync());
            }
        }
コード例 #6
0
        protected override async Task<Stream> WriteActionContentAsync(string method, string commandText, string actionName, IDictionary<string, object> parameters)
        {
            IODataRequestMessageAsync message = IsBatch
                ? await CreateBatchOperationMessageAsync(method, null, null, commandText, true)
                : new ODataRequestMessage();

            using (var messageWriter = new ODataMessageWriter(message, GetWriterSettings(), _model))
            {
                var action = _model.SchemaElements.BestMatch(
                    x => x.SchemaElementKind == EdmSchemaElementKind.Action,
                    x => x.Name, actionName, _session.Pluralizer) as IEdmAction;
                var parameterWriter = await messageWriter.CreateODataParameterWriterAsync(action);

                await parameterWriter.WriteStartAsync();

                foreach (var parameter in parameters)
                {
                    var operationParameter = action.Parameters.BestMatch(x => x.Name, parameter.Key, _session.Pluralizer);
                    if (operationParameter == null)
                        throw new UnresolvableObjectException(parameter.Key, string.Format("Parameter [{0}] not found for action [{1}]", parameter.Key, actionName));

                    await WriteOperationParameterAsync(parameterWriter, operationParameter, parameter.Key, parameter.Value);
                }

                await parameterWriter.WriteEndAsync();
                return IsBatch ? null : await message.GetStreamAsync();
            }
        }
コード例 #7
0
        protected override async Task<Stream> WriteActionContentAsync(string actionName, IDictionary<string, object> parameters)
        {
            var message = new ODataRequestMessage();
            using (var messageWriter = new ODataMessageWriter(message, GetWriterSettings(), _model))
            {
                var action = _model.SchemaElements.BestMatch(
                    x => x.SchemaElementKind == EdmSchemaElementKind.Action, 
                    x => x.Name, actionName, _session.Pluralizer);
                var parameterWriter = await messageWriter.CreateODataParameterWriterAsync(action as IEdmAction);

                await parameterWriter.WriteStartAsync();

                foreach (var parameter in parameters)
                {
                    if (!(parameter.Value is string) && parameter.Value is IEnumerable)
                    {
                        var collectionWriter = await parameterWriter.CreateCollectionWriterAsync(parameter.Key);
                        await collectionWriter.WriteStartAsync(new ODataCollectionStart());
                        foreach (var item in parameter.Value as IEnumerable)
                        {
                            await collectionWriter.WriteItemAsync(item);
                        }
                        await collectionWriter.WriteEndAsync();
                    }
                    else
                    {
                        await parameterWriter.WriteValueAsync(parameter.Key, parameter.Value);
                    }
                }

                await parameterWriter.WriteEndAsync();
                return await message.GetStreamAsync();
            }
        }
コード例 #8
0
        protected override async Task<Stream> WriteActionContentAsync(string method, string commandText, string actionName, IDictionary<string, object> parameters)
        {
            IODataRequestMessageAsync message = IsBatch
                ? await CreateBatchOperationMessageAsync(method, null, null, commandText, false)
                : new ODataRequestMessage();

            using (var messageWriter = new ODataMessageWriter(message, GetWriterSettings(), _model))
            {
                var action = _model.SchemaElements.BestMatch(
                    x => x.SchemaElementKind == EdmSchemaElementKind.Action,
                    x => x.Name, actionName, _session.Pluralizer) as IEdmAction;
                var parameterWriter = await messageWriter.CreateODataParameterWriterAsync(action);

                await parameterWriter.WriteStartAsync();

                foreach (var parameter in parameters)
                {
                    var actionParameter = action.Parameters.BestMatch(x => x.Name, parameter.Key, _session.Pluralizer);
                    if (actionParameter == null)
                        throw new UnresolvableObjectException(parameter.Key, string.Format("Parameter [{0}] not found for action [{1}]", parameter.Key, actionName));

                    if (actionParameter.Type.Definition.TypeKind == EdmTypeKind.Collection)
                    {
                        var collectionType = actionParameter.Type.Definition as IEdmCollectionType;
                        var elementType = collectionType.ElementType;
                        if (elementType.Definition.TypeKind == EdmTypeKind.Entity)
                        {
                            var feedWriter = await parameterWriter.CreateFeedWriterAsync(parameter.Key);
                            var feed = new ODataFeed();
                            await feedWriter.WriteStartAsync(feed);
                            foreach (var item in parameter.Value as IEnumerable)
                            {
                                var entry = CreateODataEntry(elementType.Definition.FullTypeName(), item.ToDictionary());

                                await feedWriter.WriteStartAsync(entry);
                                await feedWriter.WriteEndAsync();
                            }
                            await feedWriter.WriteEndAsync();
                        }
                        else
                        {
                            var collectionWriter = await parameterWriter.CreateCollectionWriterAsync(parameter.Key);
                            await collectionWriter.WriteStartAsync(new ODataCollectionStart());
                            foreach (var item in parameter.Value as IEnumerable)
                            {
                                await collectionWriter.WriteItemAsync(item);
                            }
                            await collectionWriter.WriteEndAsync();
                        }
                    }
                    else
                    {
                        await parameterWriter.WriteValueAsync(parameter.Key, parameter.Value);
                    }
                }

                await parameterWriter.WriteEndAsync();
                return IsBatch ? null : await message.GetStreamAsync();
            }
        }
コード例 #9
0
        protected override async Task<Stream> WriteActionContentAsync(string method, string commandText, string actionName, IDictionary<string, object> parameters)
        {
#if SILVERLIGHT
            IODataRequestMessage
#else
            IODataRequestMessageAsync
#endif
 message = IsBatch
                ? await CreateBatchOperationMessageAsync(method, null, null, commandText, false)
                : new ODataRequestMessage();

            using (var messageWriter = new ODataMessageWriter(message, GetWriterSettings(), _model))
            {
                var action = _model.SchemaElements
                    .Where(x => x.SchemaElementKind == EdmSchemaElementKind.EntityContainer)
                    .SelectMany(x => (x as IEdmEntityContainer).FunctionImports())
                    .BestMatch(x => x.Name, actionName, _session.Pluralizer);
#if SILVERLIGHT
                    var parameterWriter = messageWriter.CreateODataParameterWriter(action);
                    parameterWriter.WriteStart();
#else
                    var parameterWriter = await messageWriter.CreateODataParameterWriterAsync(action);
                    await parameterWriter.WriteStartAsync();
#endif


                foreach (var parameter in parameters)
                {
                    var operationParameter = action.Parameters.BestMatch(x => x.Name, parameter.Key, _session.Pluralizer);
                    if (operationParameter == null)
                        throw new UnresolvableObjectException(parameter.Key, string.Format("Parameter [{0}] not found for action [{1}]", parameter.Key, actionName));

#if SILVERLIGHT
                    WriteOperationParameter(parameterWriter, operationParameter, parameter.Key, parameter.Value);
#else
                    await WriteOperationParameterAsync(parameterWriter, operationParameter, parameter.Key, parameter.Value);
#endif
                }

#if SILVERLIGHT
                parameterWriter.WriteEnd();
#else
                await parameterWriter.WriteEndAsync();
#endif

                if (IsBatch)
                    return null;

#if SILVERLIGHT
                return message.GetStream();
#else
                return await message.GetStreamAsync();
#endif
            }
        }
コード例 #10
0
        protected override async Task <Stream> WriteActionContentAsync(string method, string commandText, string actionName, IDictionary <string, object> parameters)
        {
            IODataRequestMessageAsync message = IsBatch
                ? await CreateBatchOperationMessageAsync(method, null, null, commandText, false)
                : new ODataRequestMessage();

            using (var messageWriter = new ODataMessageWriter(message, GetWriterSettings(), _model))
            {
                var action = _model.SchemaElements.BestMatch(
                    x => x.SchemaElementKind == EdmSchemaElementKind.Action,
                    x => x.Name, actionName, _session.Pluralizer) as IEdmAction;
                var parameterWriter = await messageWriter.CreateODataParameterWriterAsync(action);

                await parameterWriter.WriteStartAsync();

                foreach (var parameter in parameters)
                {
                    var actionParameter = action.Parameters.BestMatch(x => x.Name, parameter.Key, _session.Pluralizer);
                    if (actionParameter == null)
                    {
                        throw new UnresolvableObjectException(parameter.Key, string.Format("Parameter [{0}] not found for action [{1}]", parameter.Key, actionName));
                    }

                    if (actionParameter.Type.Definition.TypeKind == EdmTypeKind.Collection)
                    {
                        var collectionType = actionParameter.Type.Definition as IEdmCollectionType;
                        var elementType    = collectionType.ElementType;
                        if (elementType.Definition.TypeKind == EdmTypeKind.Entity)
                        {
                            var feedWriter = await parameterWriter.CreateFeedWriterAsync(parameter.Key);

                            var feed = new ODataFeed();
                            await feedWriter.WriteStartAsync(feed);

                            foreach (var item in parameter.Value as IEnumerable)
                            {
                                var entry = CreateODataEntry(elementType.Definition.FullTypeName(), item.ToDictionary());

                                await feedWriter.WriteStartAsync(entry);

                                await feedWriter.WriteEndAsync();
                            }
                            await feedWriter.WriteEndAsync();
                        }
                        else
                        {
                            var collectionWriter = await parameterWriter.CreateCollectionWriterAsync(parameter.Key);

                            await collectionWriter.WriteStartAsync(new ODataCollectionStart());

                            foreach (var item in parameter.Value as IEnumerable)
                            {
                                await collectionWriter.WriteItemAsync(item);
                            }
                            await collectionWriter.WriteEndAsync();
                        }
                    }
                    else
                    {
                        await parameterWriter.WriteValueAsync(parameter.Key, parameter.Value);
                    }
                }

                await parameterWriter.WriteEndAsync();

                return(IsBatch ? null : await message.GetStreamAsync());
            }
        }