我在使用JSON.NET库对从Facebook返回的数据进行反序列化时遇到了一些麻烦.
从简单的墙贴文件返回的JSON看起来像:
{
"attachment":{"description":""},
"permalink":"http://www.facebook.com/permalink.php?story_fbid=123456789"
}
Run Code Online (Sandbox Code Playgroud)
为照片返回的JSON如下所示:
"attachment":{
"media":[
{
"href":"http://www.facebook.com/photo.php?fbid=12345",
"alt":"",
"type":"photo",
"src":"http://photos-b.ak.fbcdn.net/hphotos-ak-ash1/12345_s.jpg",
"photo":{"aid":"1234","pid":"1234","fbid":"1234","owner":"1234","index":"12","width":"720","height":"482"}}
],
Run Code Online (Sandbox Code Playgroud)
一切都很好,我没有问题.我现在遇到一个来自移动客户端的简单墙帖,其中包含以下JSON,现在反序列化失败,只有一个帖子:
"attachment":
{
"media":{},
"name":"",
"caption":"",
"description":"",
"properties":{},
"icon":"http://www.facebook.com/images/icons/mobile_app.gif",
"fb_object_type":""
},
"permalink":"http://www.facebook.com/1234"
Run Code Online (Sandbox Code Playgroud)
这是我反序列化的类:
public class FacebookAttachment
{
public string Name { get; set; }
public string Description { get; set; }
public string Href { get; set; }
public FacebookPostType Fb_Object_Type { get; set; }
public string Fb_Object_Id { get; set; }
[JsonConverter(typeof(FacebookMediaJsonConverter))]
public List<FacebookMedia> { get; set; }
public string Permalink { get; …
Run Code Online (Sandbox Code Playgroud) 我开始研究ASP.NET MVC站点的缓存基础结构.问题是,我似乎找不到合理的数据缓存位置(除了"无处不在")
现在我的架构看起来像这样:
控制器 - >服务层 - >存储库.存储库使用Linq to SQL进行数据访问.
存储库公开了一些通用方法,如Insert,GetById和GetQueryable,它们返回服务层可以进一步细化的IQueryable.
我喜欢将缓存放在存储库层中的想法,因为服务层不应该真正关心数据来自何处.但问题是缓存失效.服务层有关于数据何时变得陈旧而不是存储库的更多信息.例如:
假设我们有一个Users表和一个Orders表(规范示例).服务层提供了GetOrder(int id)等方法,可以调用存储库层:
public Order GetOrder(int id)
{
using(var repo = _repoFactory.Create<Order>())
{
return repo.GetById(id)
}
}
Run Code Online (Sandbox Code Playgroud)
要么
repo.GetQueryable(order => order.Id == id && order.HasShipped == false).Single();
Run Code Online (Sandbox Code Playgroud)
如果我们在存储库层中进行缓存,那么在知道订单数据何时发生变化时,它似乎非常有限.假设用户已被删除,导致所有订单都被CASCADE删除.服务层可能使Orders缓存无效,因为它知道用户刚被删除.虽然存储库(因为它是工作单元),但是不知道.(忽略我们不应该查询已删除用户的订单这一事实,因为它只是一个例子).
在其他情况下,我认为这表明了自己.假设我们想要获取所有用户订单:
repo.GetQueryable(order => order.UserId == userId).ToList()
Run Code Online (Sandbox Code Playgroud)
存储库可以缓存此查询的结果,但是,如果添加了另一个订单,则此查询不再有效.但是只有服务层才知道这一点.
我对存储库层的理解也是错误的.我认为它是围绕数据源的外观(即从L2SQL更改为EF到任何东西,服务层不知道底层源).
Azure Blob和共享访问签名过期时遇到问题.我需要授予对blob的访问权限超过1小时(7天),所以我使用了一个命名的容器策略,但不幸的是,这些7天后,我似乎无法生成新的URL.
我有以下代码来创建"默认"策略.请注意,在此代码中,我将过期时间设置为1分钟,以便更容易测试:
CloudStorageAccount account = new CloudStorageAccount(credentials, true);
CloudBlobClient client = new CloudBlobClient(account.BlobEndpoint, credentials);
CloudBlobContainer container = client.GetContainerReference("files");
SharedAccessPolicy sharedAccessPolicy = new SharedAccessPolicy();
sharedAccessPolicy.Permissions = SharedAccessPermissions.Read;
sharedAccessPolicy.SharedAccessStartTime = DateTime.UtcNow;
sharedAccessPolicy.SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(1);
BlobContainerPermissions blobContainerPermissions = new BlobContainerPermissions();
blobContainerPermissions.SharedAccessPolicies.Add("default", sharedAccessPolicy);
container.SetPermissions(blobContainerPermissions);
Run Code Online (Sandbox Code Playgroud)
然后,我创建一个SharedAccessSignature网址,其中包含以下内容:
CloudStorageAccount account = new CloudStorageAccount(credentials, true);
CloudBlobClient client = new CloudBlobClient(account.BlobEndpoint, credentials);
CloudBlobContainer container = client.GetContainerReference("files");
CloudBlob blob = container.GetBlobReference(path);
string sas = blob.GetSharedAccessSignature(new SharedAccessPolicy(), "default");
Console.WriteLine(blob.Uri.AbsoluteUri + sas);
Run Code Online (Sandbox Code Playgroud)
这会生成一个url,并且该url在下一分钟(或实际代码中的7天)内正常工作.一分钟结束后,网址无效,不再有效,正如预期的那样.
但是一旦过期,我再次运行代码以生成新的URL.不幸的是,它会生成相同的URL,但仍然无效.
容器策略的开始/结束时间是绝对的,这意味着当我立即设置该策略时:
sharedAccessPolicy.SharedAccessStartTime = DateTime.UtcNow;
sharedAccessPolicy.SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(1); …
Run Code Online (Sandbox Code Playgroud) 我在使用Chosen和Knockout 3.3.0 设置最初选择的选项时遇到问题.
我已经实现了这个问题的自定义选择绑定,这对于选择元素非常有用:
ko.bindingHandlers.chosen = {
init: function (element) {
ko.bindingHandlers.options.init(element);
$(element).chosen({ disable_search_threshold: 10 });
},
update: function (element, valueAccessor, allBindings) {
ko.bindingHandlers.options.update(element, valueAccessor, allBindings);
$(element).trigger('chosen:updated');
}
};
Run Code Online (Sandbox Code Playgroud)
问题是,如果我设置了初始值,它将不会显示为选中:
<select multiple class="chosen-select" data-bind="chosen: options,
optionsText: 'Label',
optionsValue: 'Id',
selectedOptions: selected">
</select>
Run Code Online (Sandbox Code Playgroud)
如果我使用常规选项绑定,它可以正常工作:
<select multiple data-bind="options: options,
optionsText: 'Label',
optionsValue: 'Id',
selectedOptions: selected">
</select>
Run Code Online (Sandbox Code Playgroud)
我已经将它们都实现为jsFiddle.如果更改了self.selected
observableArray(),然后运行,则可以看到它反映在第二个中<select>
,但在第一个中没有显示.
我有一个元素数组,我需要使用XmlSerializer序列化.我遇到的问题是我有2个派生类,并序列化它们,因此它们有一个共同基础的元素名称,似乎不起作用.
所以,这就是XML的外观:
<Root>
<Base> foo </Base>
</Root>
Run Code Online (Sandbox Code Playgroud)
相反,我得到了
<Root>
<Derived1> foo </Derived1>
</Root>
Run Code Online (Sandbox Code Playgroud)
我序列化的元素数组的代码是
private object[] m_nodes;
[System.Xml.Serialization.XmlElementAttribute("Base", typeof(Derived1)]
[System.Xml.Serialization.XmlElementAttribute("Base", typeof(Derived2)]
public object[] Nodes
{
get
{
return this.m_nodes;
}
set
{
this.m_nodes = value;
}
}
Run Code Online (Sandbox Code Playgroud)
使用上面的代码,我发现节点有一个反射错误.如果我将XmlEelementAttributes中的"Base"更改为"Derived1"和Derived2",它可以工作,但元素名称不正确.
[System.Xml.Serialization.XmlInclude(typeof(Derived1))]
public abstract class Base
{
public Base()
{
}
}
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public class Derived1: Base
{
public Derived1()
{
}
}
Run Code Online (Sandbox Code Playgroud)
任何帮助是极大的赞赏.非常感谢.