2014-12-02 3 views
0

У меня есть Azure Mobile Service с несколькими контроллерами. Один из моих контроллеров (TestSetController) имеет некоторые дополнительные методы проверки вставки.Как создать несколько методов POST на Azure Mobile Service?

Проблема: мне нужно решить: таблица TestSet имеет два разных типа тестовых наборов: один для местной команды и другой для полевой команды. Таблица содержит данные для обоих, и записи различаются полем «TeamType», в котором говорится, что локальная команда вставила TestSet или полевую команду. В любой вставке я хочу проверить, существует ли аналогичный TestSet, который был вставлен другой командой. Я хочу сравнить TestSets (если он найден), а затем сделать некоторые другие вставки/обновления в одной таблице, если TestSets разные.

Однако, я получаю эту ошибку:

Exception=System.InvalidOperationException: Multiple actions were found that match the request: 
PostTestSetDTO on type sbp_ctService.Controllers.TestSetController 
CheckForDiscrepancy on type sbp_ctService.Controllers.TestSetController 
CompareTestPointAttempts on type sbp_ctService.Controllers.TestSetController 
    at System.Web.Http.Controllers.ApiControllerActionSelector.ActionSelectorCacheItem.SelectAction(HttpControllerContext controllerContext) 
    at System.Web.Http.Controllers.ApiControllerActionSelector.SelectAction(HttpControllerContext controllerContext) 
    at System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken) 
    at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext(), Id=f07761ae-1be7-4f00-90b0-685dd0c108f3, Category='App.Request' 

Вот мой контроллер:

public class TestSetController : TableController<TestSetDTO> 
    { 
     private Context context; 

     protected override void Initialize(HttpControllerContext controllerContext) 
     { 
      base.Initialize(controllerContext); 
      context = new Context(); 
      DomainManager = new SimpleMappedEntityDomainManager<TestSetDTO, TestSet>(context, Request, Services, testset => testset.Id); 
     } 

     // GET tables/TestSet 
     [QueryableExpand("TestPointAttempts")] 
     public IQueryable<TestSetDTO> GetAllTestSetDTO() 
     { 
      return Query(); 
     } 

     // GET tables/TestSet/48D68C86-6EA6-4C25-AA33-223FC9A27959 
     public SingleResult<TestSetDTO> GetTestSetDTO(string id) 
     { 
      return Lookup(id); 
     } 

     // PATCH tables/TestSet/48D68C86-6EA6-4C25-AA33-223FC9A27959 
     public Task<TestSetDTO> PatchTestSetDTO(string id, Delta<TestSetDTO> patch) 
     { 
      return UpdateAsync(id, patch); 
     } 

     // POST tables/TestSet/48D68C86-6EA6-4C25-AA33-223FC9A27959 
     public async Task<IHttpActionResult> PostTestSetDTO(TestSetDTO item) 
     { 
      TestSet testSet = AutoMapper.Mapper.Map<TestSetDTO, TestSet>(item); 
      this.CheckForDiscrepancy(testSet); 

      TestSetDTO current = await InsertAsync(item); 
      return CreatedAtRoute("Tables", new { id = current.Id }, current); 
     } 

     // DELETE tables/TestSet/48D68C86-6EA6-4C25-AA33-223FC9A27959 
     public Task DeleteTestSetDTO(string id) 
     { 
      return DeleteAsync(id); 
     } 

     public TestSet CheckForDiscrepancy(TestSet sourceTestSet) 
     { 

      // Set the team type to search for opposite to the one being posted. 
      string searchTeamType = null; 
      if (sourceTestSet.TestTeamType == "D") 
      { 
       searchTeamType = "F"; 
      } 
      if (sourceTestSet.TestTeamType == "F") 
      { 
       searchTeamType = "D"; 
      } 

      var testSetTable = context.TestSets; 

      TestSet foundTestSet = (from ts in testSetTable 
            where ts.TileId == sourceTestSet.TileId && ts.ScenarioId == sourceTestSet.ScenarioId && ts.TestTeamType.StartsWith(searchTeamType) 
            select ts).SingleOrDefault(); 

      // If no other test set was found from the opposing team then the test set is missing. 
      // Else a testSet was found so continue with checks. 
      if (foundTestSet == null) 
      { 
       sourceTestSet.DiscrepancyTypeId = DiscrepancyType.Missing.ToString(); 
      } 
      else 
      { 
       var testPointAttemptTable = context.TestPointAttempts; 

       // Get all of the associated TestPointAttempts for each testSet. 
       sourceTestSet.TestPointAttempts = (from tpa in testPointAttemptTable 
                where tpa.TestSetId == sourceTestSet.Id 
                orderby tpa.TestAttemptNumber 
                select tpa).ToList<TestPointAttempt>(); 

       foundTestSet.TestPointAttempts = (from tpa in testPointAttemptTable 
                where tpa.TestSetId == foundTestSet.Id 
                orderby tpa.TestAttemptNumber 
                select tpa).ToList<TestPointAttempt>(); 

       bool matchingTestSets = CompareTestPointAttempts(sourceTestSet.TestPointAttempts, foundTestSet.TestPointAttempts); 

       if (!matchingTestSets) 
       { 
        sourceTestSet.DiscrepancyTypeId = DiscrepancyType.Discrepancy.ToString(); 
        sourceTestSet.DiscrepancyTestSetId = foundTestSet.Id; 
       } 

      } 

      return sourceTestSet; 
     } 

     public bool CompareTestPointAttempts(IEnumerable<TestPointAttempt> sourceTPAs, IEnumerable<TestPointAttempt> foundTPAs) 
     { 
      bool pass = false; 

      // First check if the total number of testPointAttempts are the same 
      if (sourceTPAs.Count() == foundTPAs.Count()) 
      { 
       foreach (TestPointAttempt sTpa in sourceTPAs) 
       { 
        bool foundMatch = false; 

        foreach (TestPointAttempt fTpa in foundTPAs) 
        { 
         if (sTpa.TestAttemptNumber == fTpa.TestAttemptNumber) 
         { 
          if (sTpa.TalkIn == fTpa.TalkIn && sTpa.TalkOut == fTpa.TalkOut) 
          { 
           foundMatch = true; 
          } 
         } 
        } 

        if (!foundMatch) 
        { 
         return pass; 
        } 
       } 

       // The foreach loop finished successfully meaning all matches were found 
       pass = true; 
      } 

      return pass; 
     } 

     /// <summary> 
     /// The type of discrepancy a TestSet can have. 
     /// </summary> 
     public enum DiscrepancyType 
     { 
      Discrepancy, 
      Missing, 
      None 
     } 
    } 
} 

Я использую Transfer Data Objects (DTO) для сопоставления между моделями объектов. Любая помощь будет оценена по достоинству. Я просмотрел несколько ответов на StackOverflow для ASP.NET, но все они говорят об обновлении config.Routes. Это для Azure Mobile Service, которая может иметь разные требования, чем простой веб-сайт ASP.NET.

ответ

0

Было так же просто, как сделать два метода частными и оставить фактический метод POST общедоступным. ASP.NET будет автоматически создавать маршруты только для общедоступных методов.

Смежные вопросы