我所拥有的场景是在SPJobDefinition的Execute方法中我想要遍历Web应用程序中的每个SPSite.所以我有以下代码:
foreach (SPSite site in this.WebApplication.Sites)
{
...
}
Run Code Online (Sandbox Code Playgroud)
问题是,我是否需要处理每个站点?我通常会遵循的规则只有在我自己新建的情况下才会处理或放入使用中.该Sites属性是否实际上包含完全构造的站点对象,我将在此代码中仅引用该对象.如果是这样,那么处理网站将是危险的,因为我正在修改另一个可能需要它们的对象.或者相反的是Sites属性是否根据请求构造对象..在这种情况下,我处理它们的可行性是什么?
如果我确实需要这样做,我该如何处理它们.在这种情况下我不能使用using,并且会在foreach中调用一个dispose来打破枚举?
我有一个包含大量行的数据库表.此表表示系统记录的消息.每条消息都有一个消息类型,并将其存储在表中的自己的字段中.我正在编写一个用于查询此消息日志的网站.如果我想按消息类型进行搜索,那么理想情况下我希望有一个下拉框,列出数据库中出现的消息类型.消息类型可能会随着时间的推移而发生变化,因此我无法将类型硬编码到下拉列表中.我将不得不做一些查找.迭代整个表内容以查找唯一的消息值显然是非常愚蠢但是在数据库字段中是愚蠢的我在这里要求更好的方法.也许一个单独的查找表,数据库偶尔更新,列出我可以填充我的下拉列表的唯一消息类型将是一个更好的主意.
任何建议将不胜感激.
我正在使用的平台是ASP.NET MVC和SQL Server 2005
我有一些代码可以从表达式树中提取一个装箱的可枚举实例。代码需要将其转换为object[]。
到目前为止,我已经摆脱了假设它会是这样的情况,IEnumerable<string>因此将其投射到.ToArray().
情况发生了变化,现在也可能是IEnumerable<int>。我仍然需要将盒子更改为 anobject[]并且并不真正关心类型是什么。
object list = Expression.Lambda(methodCallExpression.Object).Compile().DynamicInvoke();
var enumerable = (IEnumerable<string>)list;
object[] values = enumerable.ToArray();
Run Code Online (Sandbox Code Playgroud)
更新:
字符串是引用,整数是值类型。我发现虽然我可以装箱对整数数组的引用,但我不能假装它是装箱整数数组,因为整数不能装箱。
System.Core.dll 中发生“System.InvalidCastException”类型的异常,但未在用户代码中处理其他信息:无法转换“System.Collections.Generic.List
1[System.Int32]' to type 'System.Collections.Generic.IEnumerable1[System.Object]”类型的对象。
object list = Expression.Lambda(methodCallExpression.Object).Compile().DynamicInvoke();
var enumerable = (IEnumerable<object>)list;
object[] values = enumerable.ToArray();
Run Code Online (Sandbox Code Playgroud) 我有一个哈希表,我想从第二个哈希表更新.对于任何匹配的键,我想复制该值.我遇到的问题是当我枚举哈希表键并尝试将每个键转换为字符串时,我收到一个关于将Guid转换为字符串的异常.嗯,这是我想要的字符串.当您使用hashtable ["FirstName"]之类的索引运算符时,我希望FirstName成为键.它可能会使用下面的Guids但我需要输出密钥的字符串,即键值.
private void UpdateSharePointFromInfoPath(Hashtable infopathFields)
{
// Go through all the fields on the infopath form
// Invalid Cast Exception Here
foreach (String fieldName in infopathFields.Keys)
{
// If the same field is on sharepoint
if (workflowProperties.Item.Fields.ContainsField(fieldName))
{
// Update the sharepoint field with the new value from infopath
workflowProperties.Item[fieldName] = infopathFields[fieldName];
}
}
// Commit the changes
workflowProperties.Item.Update();
}
Run Code Online (Sandbox Code Playgroud)
编辑 我不创建这些哈希表中的任何一个.键在某处有字符串,因为我可以像下面这样输入字段名称并获取字段的值.我正在尝试为每个字段做一个简写的方法:
workflowProperties.Item["FirstName"] = infopathFields["FirstName"];
workflowProperties.Item["LastName"] = infopathFields["LastName"];
workflowProperties.Item["Address"] = infopathFields["Address"];
workflowProperties.Item["DOB"] = infopathFields["DOB"];
ect...
Run Code Online (Sandbox Code Playgroud)
编辑 有人说哈希表使用Guids,但它显然还有一个字符串,否则我就无法做infopathFields ["FirstName"].这是我在那里传递的字符串的值.
我在尝试使用C#中的yield return功能时遇到此错误.错误出现在视觉工作室内部的选择中,我真的不明白.在我看来,我正在将一个字符串转换为ListItem,然后将该批次作为IEnumerable返回.我对收益率回报和IEnumerable的理解可能很不合适,所以任何帮助都会受到赞赏.评论代码是旧学校的方式,它可以正常工作.
无法将类型'System.Collections.Generic.IEnumerable'隐式转换为'System.Web.UI.WebControls.ListItem'
public partial class CloseIncident : System.Web.UI.Page
{
private ClevelandIncidentRepository repo = new ClevelandIncidentRepository();
protected void Page_Load(object sender, EventArgs e)
{
SetDropDown(InitialType, repo.GetMainTypes());
}
private void SetDropDown(DropDownList dropDown, IEnumerable<string> items)
{
dropDown.Items.Clear();
dropDown.Text = string.Empty;
dropDown.Enabled = items.Count() > 0;
dropDown.Items.AddRange(ToListItem(items).ToArray());
}
private IEnumerable<ListItem> ToListItem(IEnumerable<string> results)
{
yield return from result in results
select new ListItem(result);
//List<ListItem> items = new List<ListItem>();
//items.AddRange(from result in results
// select new ListItem(result));
//return items;
}
}
Run Code Online (Sandbox Code Playgroud) 我有一堆网站设置相同,使用WIF身份提供商.我最近将业务逻辑从Web应用程序转移到Web Api服务应用程序中.它在与其他站点不同的虚拟目录中运行.想法是浏览器将数据放入页面AJAXy.
我遇到的问题是保护Web API.似乎WIF单点登录对传统网站没有效果.用户可以访问一个网站,重定向到身份提供商,登录并重定向回他们想要的网站.当他们访问另一个站点时,他们也会被重定向回身份提供者,但无需登录,因为FEDAUTH cookie存在,因此他们会自动进行身份验证并重定向到第二个站点.
这对于Web Api场景不起作用,因为当浏览器对它进行GET时,Api将返回重定向到调用javascript时应该期待JSON.
甚至可以用WIF保护Web Api吗?
WebApi和EF POCO可以很好地合作。我一直在思考的一个问题是,随着时间的流逝,某些对象实际上可能变得非常大。它们可以具有许多映射回数据库中列的属性。有了这些对象,很少会一次更新多个或两个以上的字段,因此引出了一个问题:为什么要求所有字段都执行从客户端到服务器再到数据库的完整行程。
一些JavaScript框架提供了有关是否将所有字段发送或仅将更改后的字段发送回服务器的选项,因此客户端是简洁明了的。
从我所看到的来看,服务器端还有些挑战。序列化器将介入并尝试将一些json或xml映射到类型。例如,如果对象中的相应属性可为空,则JSON.NET可以很好地处理缺失值。
另一方面,将反序列化的模型重新附加到实体框架是一件棘手的事情。控制器的默认WebApi模板可以一行完成:
db.Entry(user).State = EntityState.Modified;
Run Code Online (Sandbox Code Playgroud)
显然,这会将整个对象设置为修改。当然,可以将单个属性设置为修改后的属性,而不是整个对象,并且我认为这意味着EF更加聪明,只将修改后的属性发送回SQL UPDATE。
因此,这里的问题是,我如何知道更新了哪些属性?我仅在控制器方法中获得了一个对象,因此我无法询问序列化程序引入了哪些属性(即使对于给定的序列化程序而言这是可能的)。如果我有属性列表,则可以在EF中设置当前值及其状态以进行修改,并希望这会导致我的数据库查询干净。
另一个可能更明显的选择是,首先从数据库中检索要更新的对象,然后仅对检索到的对象逐个修改已更改的属性,或者如果EF支持,则可以将其传递给未附加的对象,然后让它自己做。这不是一个理想的选择,因为它的确意味着要读取整个数据库,而整个练习的重点是效率。我们要做的是交易客户端的HTTP效率和带宽,以达到服务器到数据库的效率。
因此,对我来说,如果我想在服务器上执行此操作,那我将陷入困境。WebApi和EF完成了大部分工作,但以灵活性为代价。我正在寻找我没有提到的选项或角度,以期希望一个简单的解决方案不会丢掉这两种伟大技术中的一种。
据我了解,JWT 访问令牌不应包含个人身份信息 (PII)。这是为了保持它们很小,但如果被拦截,也可以减少所包含信息的暴露。
OIDC 协议要求实现用户信息端点。可以使用访问令牌调用它,它将返回一堆有关用户的声明。实际上 id 令牌包含什么,但可能包含更多信息。
因此,即使访问令牌本身不携带此 PII,但如果被拦截,它肯定可以用来暴露所有这些信息。因此,关于访问令牌中的 PII 的争论并不真正成立。
这是否意味着我应该可以在访问令牌中包含电子邮件,因为除了子声明之外,API 可能还需要它?
它是一种非常好的公开知识,可_x0020_替换SharePoint内部字段名称中的空格.使用SharePoint Web服务时,在比较字段名称之前编写替换规则之前,这可能有点噩梦.
我刚刚在名为SSL2的字段中找到了另一个"编码异常".奇怪的是内部名称最终存在_x0053_SL2.我尝试过类似RRL2的东西_x0052_.由此看来,编码中使用的数字表示该字符的ASCII值.空间同样如此_x0020_.
我的问题是双重的:
在这种情况下,是什么导致SharePoint对这些字符进行编码.
从广义上讲,正在进行什么样的编码,我是否可以采取一般步骤来解码字符串,而不是替换我遇到的特定情况并知道这是一个问题.
当列表项更新时(ItemUpdated而不是ItemUpdating),我有一个事件接收器.在接收器内部,我再次更新列表项.这自然会像我期望的那样引发一些递归事件调用.在事件处理程序的开头设置一个断点,我认为它在事件中停止10次然后它就完成了.可能在SharePoint内部存在某种递归保护,以防止出现这种情况?
c# ×5
asp.net ×3
sharepoint ×3
ajax ×1
asp.net-mvc ×1
database ×1
dispose ×1
hashtable ×1
identity ×1
ienumerable ×1
jwt ×1
listitem ×1
oauth-2.0 ×1
spsite ×1
sql ×1
sql-server ×1
wcf ×1
wif ×1
yield-return ×1