Azureã®ã¢ãã€ã«ãµãŒãã¹ã®.NETããã¯ãšã³ãã®å©ç¹ã®1ã€ã¯ãSQL DatabaseïŒSQL AzureïŒã ãã§ãªããä»ã®ããŒã¿ãŠã§ã¢ããŠã¹ã®çµã¿èŸŒã¿ãµããŒããå©çšã§ããããšã§ãã
ããŒãã䜿çšããå Žåã jsã SQLã®äœ¿çšãæåŠããä»ã®å¯èœãªãªããžããªã䜿çšããããšãã§ããŸãïŒããšãã°ãAzure Table Storageã«é¢ããChris Reisnerã®èšäºã«æžãããŠããŸãïŒãããã®æ©èœã¯çµã¿èŸŒãŸããŠããªããããèªåã§ã³ãŒããèšè¿°ããå¿ èŠããããŸãã
.NETã䜿çšããå ŽåãéSQLãªããžããªãæäœããããã®ã»ãšãã©ã®æ©èœã¯æ¢ã«çµ±åãããŠãããããnode.jsã®ããã«ããŒã¿ãªã¯ãšã¹ããéä¿¡ããæ©èœã®ããã ãã«ããããŒãããŒãã«ãäœæããå¿ èŠã¯ãããŸãã ã
ãã®èšäºã§ã¯ã MongoDBã®ãµããŒããšãCRUDæäœãMongoDBã³ã¬ã¯ã·ã§ã³ã§çŽæ¥å®è¡ãããããŒãã«ãäœæããæ¹æ³ã«ã€ããŠèª¬æããŸãã
ããŒã¿ããŒã¹ã®ã»ããã¢ãã
ãã§ã«MongoDBã¢ã«ãŠã³ããæã£ãŠããå Žåã¯ããã®æé ãã¹ãããã§ããŸãïŒæ¥ç¶æååãèŠããŠãããŠãã ãã-åŸã§å¿ èŠã«ãªããŸãïŒã
ãã®èšäºã§ã¯ããordersããšããã³ã¬ã¯ã·ã§ã³ã䜿çšããŸãããã®ãããªã³ã¬ã¯ã·ã§ã³ãååšããªãå Žåã¯ãèªåã§äœæããå¿ èŠã¯ãããŸãããããã¯ãšã³ããèªåçã«äœæããŸãã
æåããå§ãã人ã®ããã«ãç§ã¯èª¬æããŸãïŒãã®èšäºã§ã¯ã Microsoft AzureããŒã¿ã«ã§ç¡æã§å ¥æã§ããMongo LabsããŒã¿ããŒã¹ ïŒéå®çïŒã䜿çšããŸãã ã¢ã«ãŠã³ããäœæããã«ã¯ãAzureããŒã¿ã«ã«ç§»åãã[ æ°èŠ ] -> [ã¹ã㢠]ãã¯ãªãã¯ããŠMongoLabã¢ããªã³ãéžæããã¢ã«ãŠã³ããç»é²ããŸãã
ã¢ã«ãŠã³ããæ§æããããã ãæ¥ç¶æ å ±ããã¿ã³ãã¯ãªãã¯ããŠãããŒã¿ããŒã¹ãžã®æ¥ç¶ã«å¿ èŠãªURIãååŸããŸãã ä¿åããŠãã ããã ã¢ã«ãŠã³ãåã¯ãåŸã§äœ¿çšããããŒã¿ããŒã¹ã®ååã«ãªããŸãã
MongoããŒã¿ããŒã¹ãæ§æãããŸããã ã³ã¬ã¯ã·ã§ã³ã«æåã«ã¢ã¯ã»ã¹ããããšãããšãã«äœæããããããã³ã¬ã¯ã·ã§ã³ãäœæããå¿ èŠã¯ãããŸããã
ãµãŒãã¹ã®ã»ããã¢ãã
Visual Studioã§ã¯ãEntity Framework以å€ã®ãã®ã䜿çšããããã¯ãšã³ãã§ãããžã§ã¯ããäœæããæ¹æ³ããªãããã空ã®Webãããžã§ã¯ããäœæããŸãã æåã®.NETããã¯ãšã³ãã®äœæã«é¢ããååã®èšäºã§è¡ã£ãããšããå§ããŸãããAzure Mobile Services .NETããã¯ãšã³ããšã³ãã£ãã£ãã¬ãŒã ã¯ãŒã¯NuGetããã±ãŒãžãè¿œå ãã代ããã«ã Azure Mobile Services .NETããã¯ãšã³ãMongoããã±ãŒãžãè¿œå ããŸãã
ãŸãã Microsoft.Owin.Host.SystemWebããã±ãŒãžãè¿œå ããŸããããã¯ããããã°ããã»ã¹ã容æã«ããããã«ããŒã«ã«ã§å®è¡ããæ©äŒãåŸãããã«å¿ èŠã§ãã
äž¡æ¹ã®ããã±ãŒãžïŒããã³ãããã®äŸåé¢ä¿ïŒãã€ã³ã¹ããŒã«ããåŸãããã©ã«ãã§Registerã¡ãœããã䜿çšããŠåæåéçã¯ã©ã¹WebApiConfigãè¿œå ããŸãã
public static class WebApiConfig { public static void Register() { ServiceConfig.Initialize(new ConfigBuilder()); } }
ã°ããŒãã«ã¯ã©ã¹ãã¢ããªã±ãŒã·ã§ã³ã«è¿œå ããŠãã€ãã·ã£ã©ã€ã¶ãããŒã«ã«ã«åŒã³åºããŸãã
public class Global : System.Web.HttpApplication { protected void Application_Start(object sender, EventArgs e) { WebApiConfig.Register(); } }
ããŒã¿ããŒã¹ã³ã¬ã¯ã·ã§ã³ã«æ ŒçŽããããªããžã§ã¯ãã¢ãã«ãå®çŸ©ããŸãã èŠçŽ ã®ãªã¹ããå«ãOrderã¯ã©ã¹ãå®çŸ©ããŸãã
public class Order : DocumentData { public DateTime OrderDate { get; set; } public string Client { get; set; } public List<OrderItem> Items { get; set; } } public class OrderItem { public string Name { get; set; } public double Quantity { get; set; } public double Price { get; set; } }
ããŒã¿ã¢ãã«ã¯ãEntity FrameworkããŒã¿ã¢ãã«ãšåãæ¹æ³
ItableData
ã€ã³ã¿ãŒãã§ã€ã¹
ItableData
å®è£ ããå¿ èŠããããŸãããã®ã€ã³ã¿ãŒãã§ã€ã¹ãEntity Frameworkã«å®è£ ããã«ã¯ãMongoDBã䜿çšãããšãã«
DocumentData
ã¯ã©ã¹ã«äŒŒãããŒã¹ã¯ã©ã¹
EntityData
ã䜿çšã
.
ãã®åŸãã¢ãã«ã¯ã©ã¹ã®ãµããžã§ã¯ãé åã®ããããã£ã®ã¿ã決å®ã§ããŸãã
ããŒãã«å®çŸ©
MongoDBã®ããŒãã«ã¯ãå®éã«ã¯EFã«äŒŒãŠããŸãã ãµããžã§ã¯ããšãªã¢ã®æ°ããã³ã³ãããŒã«ã¯ã©ã¹ãå®è£ ããå¿ èŠãããç¶æ³ã®ã¿ãé€ããæäœã¯åãã·ããªãªã§å®è£ ã§ããŸããAzureMobile Services .NETããã¯ãšã³ãMongoããã±ãŒãžããå©çšå¯èœãªMongoDomainManagerã¯ã©ã¹ã䜿çšã§ããŸãã
æäœãå®è¡ããã«ã¯ãMongoDBãã©ã€ã㌠ïŒãŸãã¯ä»ã®Mongoã¯ã©ã€ã¢ã³ãïŒ ããåžžã«çŽæ¥åã䜿çšããŠæäœãå®è£ ã§ããŸãããäžè¬çãªã·ããªãªã§ã¯ãå¿ èŠãªå®è£ ã¯åºæ¬ã¯ã©ã¹TableController < T>ã«ãã£ãŠæäŸãããŸãã
public class OrderController : TableController<Order> { protected override void Initialize(HttpControllerContext controllerContext) { base.Initialize(controllerContext); var connStringName = "mongodb"; var dbName = "MyMongoLab"; var collectionName = "orders"; this.DomainManager = new MongoDomainManager<Order>(connStringName, dbName, collectionName, this.Request, this.Services); } public IQueryable<Order> GetAllOrders() { return base.Query(); } public Order GetOneOrder(string id) { var result = base.Lookup(id).Queryable.FirstOrDefault(); if (result == null) { throw new HttpResponseException(HttpStatusCode.NotFound); } else { return result; } } public Task<Order> PostOrder(Order order) { return base.InsertAsync(order); } public Task DeleteOrder(string id) { return base.DeleteAsync(id); } public Task<Order> PatchOrder(string id, Delta<Order> patch) { return base.UpdateAsync(id, patch); } }
MongoDomainManager
ã³ã³ã¹ãã©ã¯ã¿ãŒã®æåã®ãã©ã¡ãŒã¿ãŒã¯ãå®éã®ããŒã¿ããŒã¹æ¥ç¶æååãå«ãæ§æå ã®< connectionStrings>ã»ã¯ã·ã§ã³ã®èŠçŽ ã®ååã§ãïŒå®éã®æ¥ç¶æååãã³ã³ã¹ãã©ã¯ã¿ãŒã«æž¡ãé¢æ°ãè¿œå ã§ããŸãïŒã
web.configãã¡ã€ã«ã«é©åãªã»ã¯ã·ã§ã³ãè¿œå ããŸã ïŒAzureããŒã¿ã«ã§ååŸããæ¥ç¶æååã䜿çšããŸãïŒã
<connectionStrings> <add name="mongodb" connectionString="mongodb://MyMongoLab:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-@dsNNNNNN.mongolab.com:PPPPP/MyMongoLab"/> </connectionStrings>
ããã§ãããžã§ã¯ããéå§ãããŸãã
ãµãŒãã¹ãã¹ã
ãµãŒãã¹ããã¹ãããŸãã ãµãŒãã¹ã«ãªã¯ãšã¹ããéä¿¡ããã«ã¯ã Fiddlerã䜿çšããŸãã
ãŸããGETãè¿ããã®ãèŠãŠã¿ãŸãããã
GET http://localhost:54524/tables/order HTTP/1.1 User-Agent: Fiddler Host: localhost:54524 =-=-=-=-=-=-=-=-=- HTTP/1.1 200 OK Cache-Control: no-cache Pragma: no-cache Content-Length: 2 Content-Type: application/json; charset=utf-8 Expires: 0 Server: Microsoft-IIS/8.0 X-Powered-By: ASP.NET Date: Mon, 14 Apr 2014 15:43:31 GMT []
äºæããªãããšã¯ãããŸããïŒã泚æãã³ã¬ã¯ã·ã§ã³ãæ¢ã«ããããšãé€ããŠïŒã
ã³ã¬ã¯ã·ã§ã³ã«ããã€ãã®èŠçŽ ãè¿œå ããŸãã
POST http://localhost:54524/tables/order HTTP/1.1 User-Agent: Fiddler Host: localhost:54524 Content-Length: 211 Content-Type: application/json { "client":"John Doe", "orderDate":"2014-04-13T00:00:00Z", "items":[ { "name": "bread", "quantity": 1, "price": 1.99 }, { "name": "milk", "quantity": 2, "price": 2.99 } ] } =-=-=-=-=-=-=-=-=- HTTP/1.1 200 OK Content-Length: 383 Content-Type: application/json; charset=utf-8 Server: Microsoft-IIS/8.0 X-Powered-By: ASP.NET Date: Mon, 14 Apr 2014 15:53:13 GMT { "orderDate": "2014-04-13T00:00:00Z", "client": "John Doe", "items": [ { "name": "bread", "quantity": 1.0, "price": 1.99 }, { "name": "milk", "quantity": 2.0, "price": 2.99 } ], "id": "534c0469f76e1e10c4703c2b", "__createdAt": "2014-04-14T15:53:12.982Z", "__updatedAt": "2014-04-14T15:53:12.982Z" }
ãããŠããäžã€ïŒ
POST http://localhost:54524/tables/order HTTP/1.1 User-Agent: Fiddler Host: localhost:54524 Content-Length: 216 Content-Type: application/json { "client":"Jane Roe", "orderDate":"2014-02-22T00:00:00Z", "items":[ { "name": "nails", "quantity": 100, "price": 3.50 }, { "name": "hammer", "quantity": 1, "price": 12.34 } ] } =-=-=-=-=-=-=-=-=- HTTP/1.1 200 OK Content-Length: 387 Content-Type: application/json; charset=utf-8 Server: Microsoft-IIS/8.0 X-Powered-By: ASP.NET Date: Mon, 14 Apr 2014 15:53:21 GMT { "orderDate": "2014-02-22T00:00:00Z", "client": "Jane Roe", "items": [ { "name": "nails", "quantity": 100.0, "price": 3.5 }, { "name": "hammer", "quantity": 1.0, "price": 12.34 } ], "id": "534c0471f76e1e10c4703c2c", "__createdAt": "2014-04-14T15:53:21.557Z", "__updatedAt": "2014-04-14T15:53:21.557Z }
çµæã確èªããããã«å¥ã®GETãªã¯ãšã¹ããéä¿¡ããŸãã
GET http://localhost:54524/tables/order HTTP/1.1 User-Agent: Fiddler Host: localhost:54524 =-=-=-=-=-=-=-=-=- HTTP/1.1 200 OK Cache-Control: no-cache Pragma: no-cache Content-Length: 239 Content-Type: application/json; charset=utf-8 Expires: 0 Server: Microsoft-IIS/8.0 X-Powered-By: ASP.NET Date: Mon, 14 Apr 2014 15:55:12 GMT [ { "id": "534c0469f76e1e10c4703c2b", "client": "John Doe", "orderDate": "2014-04-13T00:00:00Z" }, { "id": "534c0471f76e1e10c4703c2c", "client": "Jane Roe", "orderDate": "2014-02-22T00:00:00Z" } ]
å ã«èŠçŽ ãè¿œå ããŸãããããªããžã§ã¯ãã®è€éãªãããã㣠ïŒã¢ã€ãã ãªã¹ãïŒã¯ååŸããŸããã§ããã
åé¡ã¯ãé¢æ°ã®æ»ãå€ã®åïŒ IQueryable Order ïŒãè€éãªåãè¿ãã®ã¯ãèŠæ±ã§æ瀺çã«æå®ãããŠããå Žåã®ã¿ã§ãïŒ $ expand = < propertyName>ãã©ã¡ãŒã¿ãŒã䜿çšïŒã
queryableåã®ãªããžã§ã¯ããè¿ãã¡ãœããããããšäŸ¿å©ã§ããããã«ãããããã«ããã£ã«ã¿ãŒãšäžŠã¹æ¿ãïŒãã©ã¡ãŒã¿ãŒ$ filterãš$ orderbyã䜿çšïŒã䜿çšã§ããããã«ãªããŸãã
ãã®ãããã¯ãšãªå¯èœãªããžã§ã¯ãã®äœ¿çšãç¶ç¶ãã$ expandãã©ã¡ãŒã¿ãéä¿¡ããŠè€ååãè¿ãããå¥ã®è¿ãããåã«ç§»åãããã決å®ããå¿ èŠããããŸãã
åŸè ã®å Žåãå€æŽã¯éåžžã«ç°¡åã§ãã
public List<Order> GetAllOrders() { return base.Query().ToList(); }
ã¯ãšãªãçæããããã®ãªãã·ã§ã³ãããã€ããããŸãã ïŒãµãŒããŒäžã§ïŒæãç°¡åãªã®ã¯ãããããŒã§$ expandãã©ã¡ãŒã¿ãŒãã¯ã©ã€ã¢ã³ãã«éä¿¡ãããããšã§ãããã®åŸããµãŒããŒã§äœãå€æŽããå¿ èŠã¯ãããŸããã
ãªã¯ãšã¹ããéä¿¡ããããã¥ã¡ã³ãå šäœãååŸããŸãã
GET http://localhost:54524/tables/order?$expand=items HTTP/1.1 User-Agent: Fiddler Host: localhost:54524 =-=-=-=-=-=-=-=-=- HTTP/1.1 200 OK Cache-Control: no-cache Pragma: no-cache Content-Length: 663 Content-Type: application/json; charset=utf-8 Expires: 0 Server: Microsoft-IIS/8.0 X-Powered-By: ASP.NET Date: Mon, 14 Apr 2014 17:52:26 GMT [ { "id": "534c0469f76e1e10c4703c2b", "client": "John Doe", "orderDate": "2014-04-13T00:00:00Z", "items": [ { "name": "bread", "quantity": 1.0, "price": 1.99 }, { "name": "milk", "quantity": 2.0, "price": 2.99 } ] }, { "id": "534c0471f76e1e10c4703c2c", "client": "Jane Roe", "orderDate": "2014-02-22T00:00:00Z", "items": [ { "name": "nails", "quantity": 100.0, "price": 3.5 }, { "name": "hammer", "quantity": 1.0, "price": 12.34 } ] } ]
å¥ã®ãªãã·ã§ã³ã¯ã ã¢ã¯ã·ã§ã³ ãã£ã«ã¿ãŒå±æ§ã䜿çšããããšã§ããããã«ãããçä¿¡ãªã¯ãšã¹ããå€æŽããã$ expandãã©ã¡ãŒã¿ãŒãåžžã«ãªã¯ãšã¹ãã«è¿œå ãããŸãã
以äžã¯å¯èœãªå®è£ ã®1ã€ã§ãã
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] class ExpandPropertyAttribute : ActionFilterAttribute { string propertyName; public ExpandPropertyAttribute(string propertyName) { this.propertyName = propertyName; } public override void OnActionExecuting(HttpActionContext actionContext) { base.OnActionExecuting(actionContext); var uriBuilder = new UriBuilder(actionContext.Request.RequestUri); var queryParams = uriBuilder.Query.TrimStart('?').Split(new[] { '&' }, StringSplitOptions.RemoveEmptyEntries).ToList(); int expandIndex = -1; for (var i = 0; i < queryParams.Count; i++) { if (queryParams[i].StartsWith("$expand", StringComparison.Ordinal)) { expandIndex = i; break; } } if (expandIndex < 0) { queryParams.Add("$expand=" + this.propertyName); } else { queryParams[expandIndex] = queryParams[expandIndex] + "," + propertyName; } uriBuilder.Query = string.Join("&", queryParams); actionContext.Request.RequestUri = uriBuilder.Uri; } }
ãããŠããã®å±æ§ã§ã¡ãœãããããŒã¯ããåŸïŒ
[ExpandProperty("Items")] public IQueryable<Order> GetAllOrders() { return base.Query(); }
ä»ã®ã¯ãšãªå¯èœãªå±æ§ã䜿çšããã¯ãšãªãéä¿¡ã§ããŸãããåæã«ãªããžã§ã¯ãã®ãã¹ãŠã®èŠçŽ ãè¿ããŸãã
GET http://localhost:54524/tables/order?$orderby=client HTTP/1.1 User-Agent: Fiddler Host: localhost:54524 =-=-=-=-=-=-=-=-=- HTTP/1.1 200 OK Cache-Control: no-cache Pragma: no-cache Content-Length: 663 Content-Type: application/json; charset=utf-8 Expires: 0 Server: Microsoft-IIS/8.0 X-Powered-By: ASP.NET Date: Mon, 14 Apr 2014 18:37:27 GMT [ { "id": "534c0471f76e1e10c4703c2c", "client": "Jane Roe", "orderDate": "2014-02-22T00:00:00Z", "items": [ { "name": "nails", "quantity": 100.0, "price": 3.5 }, { "name": "hammer", "quantity": 1.0, "price": 12.34 } ] }, { "id": "534c0469f76e1e10c4703c2b", "client": "John Doe", "orderDate": "2014-04-13T00:00:00Z", "items": [ { "name": "bread", "quantity": 1.0, "price": 1.99 }, { "name": "milk", "quantity": 2.0, "price": 2.99 } ] } ]
å±é
ãµãŒãã¹ãããŒã«ã«ã§éå§ãããã®ã§ã Azureã§ãã¹ãŠãå ¬éããæºåãã§ããŸããã
ããŒã¿ã«ããå ¬éãããã¡ã€ã«ãããŠã³ããŒãããåŸãVSã§ãããžã§ã¯ããå³ã¯ãªãã¯ããŠ[ å ¬é]ãéžæããŸã-ãµãŒãã¹ãå ¬éãããŸãã
ãŸããFiddlerãå床䜿çšããå ŽåãAzureãã2ã€ã®ãé åºãèŠçŽ ãçŽæ¥ååŸããå¿ èŠããããŸãã
GET http://blog20140413.azure-mobile.net/tables/order HTTP/1.1 User-Agent: Fiddler Host: blog20140413.azure-mobile.net =-=-=-=-=-=-=-=-=- HTTP/1.1 500 Internal Server Error Cache-Control: no-cache Pragma: no-cache Content-Length: 43 Content-Type: application/json; charset=utf-8 Expires: 0 Server: Microsoft-IIS/8.0 X-Powered-By: ASP.NET Date: Mon, 14 Apr 2014 18:50:22 GMT { "message": "An error has occurred." }
äœããããããã£ãã ããã©ã«ãã§ã¯ãã©ã³ã¿ã€ã ã¯ïŒã»ãã¥ãªãã£äžã®çç±ããïŒãšã©ãŒã®è©³çŽ°ãè¿ããŸããããã®ãããããŒã¿ã«ã®ãã°ãã¡ã€ã«ããã§ãã¯ããŠãäœãèµ·ãã£ãã®ãã確èªã§ããŸãã ãšã©ãŒã¯æ¬¡ã®ãšããã§ãã
Exception=System.ArgumentException: No connection string named 'mongodb' could be found in the service configuration. at Microsoft.WindowsAzure.Mobile.Service.MongoDomainManager`1.GetMongoContext(String connectionStringName) at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory) at Microsoft.WindowsAzure.Mobile.Service.MongoDomainManager`1..ctor(String connectionStringName, String databaseName, String collectionName, HttpRequestMessage request, ApiServices services) at MongoDbOnNetBackend.OrderController.Initialize(HttpControllerContext controllerContext) at System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken) at System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsyncCore(HttpRequestMessage request, CancellationToken cancellationToken) at System.Web.Http.Dispatcher.HttpControllerDispatcher.d__0.MoveNext(), Id=6133b3eb-9851-4
åé¡ã¯ããµãŒãã¹ãéå§ãããšãã«ããŒã«ã«ã§äœ¿çšãããããŒã«ã«web.configãã¡ã€ã«ããã¯ã©ãŠãã§ãµãŒãã¹ãéå§ãããšãã«é©åã§ãªãããšã§ãã å¥ã®æ¹æ³ã§æ¥ç¶æååãå®çŸ©ããå¿ èŠããããŸãã
æ®å¿µãªããããã®ãšã©ãŒã®ãããæ¥ç¶æååã決å®ããç°¡åãªæ¹æ³ããããŸããïŒããŒã¿ã«ã«ãã£ãŠç°¡åã«ãªããŸããããããŸã§ã®ãšãããã®æ©èœã¯ãããŸããïŒããã®ããã åé¿çã䜿çšããŸãã
ãããè¡ãã«ã¯ãã¢ãã€ã«ãµãŒãã¹ã»ã¯ã·ã§ã³ã®ããŒã¿ã«ã«ç§»åãã[ æ§æ ]ã¿ãã«æ°ããã¢ããªèšå®ãè¿œå ããŸãããã®å€ã¯ãweb.configãã¡ã€ã«ã§å®çŸ©ããæ¥ç¶æååã§ãã
ããŒãã«ã³ã³ãããŒã©ãŒãåæåããåŸãã¢ããªã±ãŒã·ã§ã³èšå®ããåãåã£ãå€ã«åºã¥ããŠããµãŒãã¹èšå®ã®æ¥ç¶æååãå€æŽããŸãã
static bool connectionStringInitialized = false; private void InitializeConnectionString(string connStringName, string appSettingName) { if (!connectionStringInitialized) { connectionStringInitialized = true; if (!this.Services.Settings.Connections.ContainsKey(connStringName)) { var connFromAppSetting = this.Services.Settings[appSettingName]; var connSetting = new ConnectionSettings(connStringName, connFromAppSetting); this.Services.Settings.Connections.Add(connStringName, connSetting); } } } protected override void Initialize(HttpControllerContext controllerContext) { var connStringName = "mongodb"; var dbName = "MyMongoLab"; var collectionName = "orders"; // Workaround for lack of connection strings in the portal InitializeConnectionString(connStringName, "mongoConnectionString"); base.Initialize(controllerContext); this.DomainManager = new MongoDomainManager<Order>(connStringName, dbName, collectionName, this.Request, this.Services); }
ããã§ããµãŒãã¹ãå床ãããã€ãããšãAzureããããŒãã«ããŒã¿ãååŸã§ããã¯ãã§ãã
GET http://blog20140413.azure-mobile.net/tables/order HTTP/1.1 User-Agent: Fiddler Host: blog20140413.azure-mobile.net x-zumo-application: cOFQkbaAmffuVRBJRpYDKHbNHbtDYG97 =-=-=-=-=-=-=-=-=- HTTP/1.1 200 OK Cache-Control: no-cache Pragma: no-cache Content-Length: 663 Content-Type: application/json; charset=utf-8 Expires: 0 Server: Microsoft-IIS/8.0 X-Powered-By: ASP.NET Date: Mon, 14 Apr 2014 19:21:11 GMT [ { "id": "534c0469f76e1e10c4703c2b", "client": "John Doe", "orderDate": "2014-04-13T00:00:00Z", "items": [ { "name": "bread", "quantity": 1.0, "price": 1.99 }, { "name": "milk", "quantity": 2.0, "price": 2.99 } ] }, { "id": "534c0471f76e1e10c4703c2c", "client": "Jane Roe", "orderDate": "2014-02-22T00:00:00Z", "items": [ { "name": "nails", "quantity": 100.0, "price": 3.5 }, { "name": "hammer", "quantity": 1.0, "price": 12.34 } ] } ]
æåŸã«ããµãŒãã¹ãããŒã«ã«ã§èµ·åããããšãããã©ã«ãã§ã¯èªèšŒãå®è¡ãããªãããããªã¯ãšã¹ããããŒãéä¿¡ããªãå ŽåããããŸãã Azureã®ãµãŒããŒã«ãªã¯ãšã¹ããéä¿¡ããå Žåããx-zumo-applicationãããããŒã§ã¢ããªã±ãŒã·ã§ã³ã㌠ïŒããã©ã«ãã®èªèšŒã¬ãã«ïŒãæå®ããå¿ èŠããããŸãã
ãããã«
ã ã¢ãã€ã«ãµãŒãã¹çšã® Azure NETããã¯ãšã³ãã¯ãããŒãã«ããŒã¿ãæœè±¡åããã¹ãã¬ãŒãžãããã€ããŒã®ã»ãããæäŸããŸãã
æ¢åã®äŸã®ã»ãšãã©ã¯Entity FrameworkïŒSQLãµãŒããŒïŒã§ã®äœæ¥ã«ã€ããŠèª¬æããŠããããããã®æçš¿ã§MongoDBãããã€ããŒã䜿çšããŠããŒã¿ãä¿åããæ¹æ³ãåŠã¹ãããšãé¡ã£ãŠããŸãã
ãããŠããã€ãã®ããã«ãããã°ãMSDNãã©ãŒã©ã ããŸãã¯twitter @AzureMobileã§ã³ã¡ã³ããã¢ããã€ã¹ãæè¿ããŸãã
䟿å©ãªãªã³ã¯
Microsoft Azureã®30æ¥éç¡æè©Šçšã
ã¹ã¿ãŒãã¢ãã ã ããŒãã㌠ãæåž«ã MSDNãµãã¹ã¯ã©ã€ããŒåãã®Microsoft AzureãªãœãŒã¹ãžã®ç¡æã¢ã¯ã»ã¹
Microsoft Azure Development CenterïŒazurehub.ruïŒ-Microsoft Azureã§ã®ãµãŒãã¹ãšéçºã®éžæã«é¢ããã¹ã¯ãªãããã¬ã€ããäŸãæšå¥šäºé ã
ææ°ã®Microsoft Azureãã¥ãŒã¹-Twitter.com/windowsazure
Facebookã®Microsoft Azureã³ãã¥ãã㣠ã ããã§ã¯ãå°é家ãåçãå€ãã®ãã¥ãŒã¹ãã芧ããã ããŸãã
Microsoft Virtual AcademyïŒMVAïŒãã¬ãŒãã³ã°ã³ãŒã¹
ç¡æãŸãã¯è©Šçšçã®Visual Studio 2013ãããŠã³ããŒããã