小编mfa*_*nto的帖子

有时数组和有时反对时反序列化JSON

我在使用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)

c# json json.net facebook-c#-sdk json-deserialization

47
推荐指数
4
解决办法
3万
查看次数

ASP.NET存储库模式/服务层缓存

我开始研究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到任何东西,服务层不知道底层源).

asp.net caching repository-pattern

11
推荐指数
1
解决办法
4010
查看次数

Azure blob容器共享访问签名到期

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)

azure azure-storage-blobs

8
推荐指数
1
解决办法
8835
查看次数

选择的Knockout没有设置初始选择的选项

我在使用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.selectedobservableArray(),然后运行,则可以看到它反映在第二个中<select>,但在第一个中没有显示.

jquery-chosen knockout.js

4
推荐指数
1
解决办法
3126
查看次数

派生类的XML序列化

我有一个元素数组,我需要使用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)

任何帮助是极大的赞赏.非常感谢.

c# xml-serialization

1
推荐指数
1
解决办法
3049
查看次数