Azure移动服务 - 从另一个自定义控制器访问表控制器

时间:2015-05-18 08:06:57

标签: c# asp.net azure azure-sql-database azure-mobile-services

我正在尝试使用其他控制器方法的控制器访问表。 但是当该方法尝试调用表控制器方法时,我得到一个异常:    Exception=System.NullReferenceException: Object reference not set to an instance of an object. at Microsoft.WindowsAzure.Mobile.Service.TableController.....

  • 我设法从Web API访问表控制器方法并成功执行它。
  • 我尝试使用TodoItem做同样的事情,作为初始移动服务的一个例子。
  • 在几个发布到服务器尝试解决问题之后,Web API停止工作,我得到了这个例外:An exception of type 'Microsoft.WindowsAzure.MobileServices.MobileServiceInvalidOperationException' occurred in mscorlib.dll but was not handled in user code Additional information: The request could not be completed. (Internal Server Error)当我重新打开一个移动服务和数据库时,我设法解决了它与完全相同的代码#39; t work。

任何提示?

这是我的控制器向导创建的表控制器:     

using System.Linq;
using System.Threading.Tasks;
using System.Web.Http;
using System.Web.Http.Controllers;
using System.Web.Http.OData;
using Microsoft.WindowsAzure.Mobile.Service;
using FringProjectMobileService.DataObjects;
using FringProjectMobileService.Models;

namespace FringProjectMobileService.Controllers
{
    public class StorageItemController : TableController<StorageItem>
    {
        protected override void Initialize(HttpControllerContext controllerContext)
        {
            base.Initialize(controllerContext);
            FringProjectMobileServiceContext context = new FringProjectMobileServiceContext();
            DomainManager = new EntityDomainManager<StorageItem>(context, Request, Services);
        }

        // GET tables/StorageItem
        public IQueryable<StorageItem> GetAllStorageItem()
        {
            return Query(); 
        }

        // GET tables/StorageItem/xxxxxxxxxx
        public SingleResult<StorageItem> GetStorageItem(string id)
        {
            return Lookup(id);
        }

        // PATCH tables/StorageItem/xxxxxxxx
        public Task<StorageItem> PatchStorageItem(string id, Delta<StorageItem> patch)
        {
             return UpdateAsync(id, patch);
        }

        // POST tables/StorageItem
        public async Task<IHttpActionResult> PostStorageItem(StorageItem item)
        {
            StorageItem current = await InsertAsync(item);
            return CreatedAtRoute("Tables", new { id = current.Id }, current);
        }

        // DELETE tables/StorageItem/xxxxxxxxxx
        public Task DeleteStorageItem(string id)
        {
             return DeleteAsync(id);
        }

    }
}

在试图访问该方法的其他控制器代码下面:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using Microsoft.WindowsAzure.Mobile.Service;


namespace FringProjectMobileService.Controllers
{
    public class ArduinoController : ApiController
    {
        public ApiServices Services { get; set; }

        // GET api/Arduino
        public string Get()
        {
            Services.Log.Info("Hello from custom controller!");
            return "Hello";
        }


        public async void PostProcessTag(String id)
        {
            Microsoft.WindowsAzure.MobileServices.MobileServiceClient client = new Microsoft.WindowsAzure.MobileServices.MobileServiceClient("http://some-service.azure-mobile.net", "XXXXXXXXXXXXXXX");
            Microsoft.WindowsAzure.MobileServices.IMobileServiceTable<DataObjects.StorageItem> storage_item_table = client.GetTable<DataObjects.StorageItem>();
            await storage_item_table.ToEnumerableAsync();
        }
    }
}

我还尝试了该方法的不同实现:

        public void PostProcessTag(String id)
        {
            StorageItemController table_controller = new StorageItemController();
            IQueryable<DataObjects.StorageItem> item = table_controller.GetAllStorageItem();
        }

服务上下文:

using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;
using System.Linq;
using Microsoft.WindowsAzure.Mobile.Service;
using Microsoft.WindowsAzure.Mobile.Service.Tables;

namespace FringProjectMobileService.Models
{
    public class FringProjectMobileServiceContext : DbContext
    {
        // You can add custom code to this file. Changes will not be overwritten.
        // 
        // If you want Entity Framework to alter your database
        // automatically whenever you change your model schema, please use data migrations.
        // For more information refer to the documentation:
        // http://msdn.microsoft.com/en-us/data/jj591621.aspx
        //
        // To enable Entity Framework migrations in the cloud, please ensure that the 
        // service name, set by the 'MS_MobileServiceName' AppSettings in the local 
        // Web.config, is the same as the service name when hosted in Azure.

        private const string connectionStringName = "Name=MS_TableConnectionString";

        public FringProjectMobileServiceContext() : base(connectionStringName)
        {
        } 

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            string schema = ServiceSettingsDictionary.GetSchemaName();
            if (!string.IsNullOrEmpty(schema))
            {
                modelBuilder.HasDefaultSchema(schema);
            }

            modelBuilder.Conventions.Add(
                new AttributeToColumnAnnotationConvention<TableColumnAttribute, string>(
                    "ServiceTableColumn", (property, attributes) => attributes.Single().ColumnType.ToString()));
        }

        public System.Data.Entity.DbSet<FringProjectMobileService.DataObjects.StorageItem> StorageItems { get; set; }
    }
}

0 个答案:

没有答案