Garry A
Garry A

Reputation: 465

Azure functions in .net6.0

I have an azure function in .net6.0 converted from framework 4.72. My code as follows,

 [FunctionName("GetAllProducts")] 
    public static async Task<HttpResponseMessage> GetAllProducts(
        [HttpTrigger(
            AuthorizationLevel.Function, 
            "get", 
            Route = null)]HttpRequestMessage request)
    {
        try
        {
            IDocumentClient documentClient= new DocumentClient(new Uri(EndpointUrl), PrimaryKey);
            var documentsStore = new DbRepository.DocumentDBRepository<ProductsStore>(DatabaseName, documentClient, ProductsCollection);

            var queryable = documentsStore.GetQueryable();
            var result =
                await documentsStore.ExecuteQueryAsync(queryable.Where(a => a.Id == Guid.Parse(DocumentId)));

           var products = result.SelectMany(pr => pr.products).ToList();

            if (!result.Any())
            {
                return req.CreateResponse(HttpStatusCode.NotFound, $"Error: Products not found.");
            }

            return req.CreateResponse(HttpStatusCode.OK, products, "text/json");
        }
        catch (Exception ex)
        {
            return req.CreateResponse(HttpStatusCode.BadRequest, $"Failure: {ex.GetType().Name} occurred {ex.Message}");
        }
    }

The code is working when I run locally within visual studio, but when I upload it to azure it returns 500 OK response. Any ideas?

Upvotes: 0

Views: 61

Answers (1)

Ikhtesam Afrin
Ikhtesam Afrin

Reputation: 6484

I am able to get the expected response using below code.

using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Microsoft.Azure.Documents;
using Microsoft.Azure.Documents.Client;
using System.Linq;

namespace _78932604
{
    public static class Function1
    {
        private static readonly string EndpointUrl = "https://{cosmosDBName}.documents.azure.com:443/";
        private static readonly string PrimaryKey = "yYgw*********OaEQ==";
        private static readonly string DatabaseName = "TestDB";
        private static readonly string ProductsCollection = "TestContainer";
        private static readonly string DocumentId = "b1a7b3b8-1f44-4e3f-a8f4-e4e5e4e9c3c5";

        [FunctionName("GetAllProducts")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = null)] HttpRequest req,
            ILogger log)
        {
            try
            {
                
                IDocumentClient documentClient = new DocumentClient(new Uri(EndpointUrl), PrimaryKey);
                var documentsStore = new DbRepository.DocumentDBRepository<ProductsStore>(DatabaseName, documentClient, ProductsCollection);

                var queryable = documentsStore.GetQueryable();
                var result = await documentsStore.ExecuteQueryAsync(queryable.Where(a => a.Id == Guid.Parse(DocumentId)));

                var products = result.SelectMany(pr => pr.products).ToList();

                if (!products.Any())
                {
                    return new NotFoundObjectResult("Error: Products not found.");
                }

                return new OkObjectResult(products);
            }
            catch (Exception ex)
            {
                return new BadRequestObjectResult($"Failure: {ex.GetType().Name} occurred {ex.Message}");
            }
        }
    }
}

DbRepository-

using Microsoft.Azure.Documents.Client;
using Microsoft.Azure.Documents.Linq;
using Microsoft.Azure.Documents;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _78932604
{
    public class DbRepository
    {
        private readonly string databaseName;
        private readonly IDocumentClient client;

        public DbRepository(string databaseName, IDocumentClient client)
        {
            this.databaseName = databaseName;
            this.client = client;
        }

        public class DocumentDBRepository<T> where T : class
        {
            private readonly Uri collectionUri;
            private readonly IDocumentClient client;

            public DocumentDBRepository(string databaseName, IDocumentClient client, string collectionName)
            {
                this.client = client;
                this.collectionUri = UriFactory.CreateDocumentCollectionUri(databaseName, collectionName);
            }

            public IQueryable<T> GetQueryable()
            {
                return client.CreateDocumentQuery<T>(collectionUri, new FeedOptions { MaxItemCount = -1 });
            }

            public async Task<IEnumerable<T>> ExecuteQueryAsync(IQueryable<T> query)
            {
                var documentQuery = query.AsDocumentQuery();
                var results = new List<T>();

                while (documentQuery.HasMoreResults)
                {
                    var response = await documentQuery.ExecuteNextAsync<T>();
                    results.AddRange(response);
                }

                return results;
            }
        }
    }
}

I can get the output in local as well as in Function App.

enter image description here

enter image description here

Upvotes: 0

Related Questions