我将在前言中说我知道问题是什么,我只是不知道如何解决它.我正在与.NET SOA数据层进行通信,该数据层将数据作为JSON返回.一种这样的方法返回一个在其中包含多个集合的对象.该对象基本上如下所示:
{
"Name":"foo",
"widgetCollection":[{"name","foo"}, {"name","foo"},],
"cogCollection": [{"name","foo"}, {"childCogs",<<new collection>>},],
}
Run Code Online (Sandbox Code Playgroud)
我代表这个对象的类看起来像这样:
public class SuperWidget : IWidget
{
public string Name { get; set; }
public ICollection<IWidget> WidgetCollection { get; set; }
public ICollection<ICog> CogCollection { get; set; }
public SuperWidget()
{
}
[JsonConstructor]
public SuperWidget(IEnumerable<Widget> widgets, IEnumerable<Cog> cogs)
{
WidgetCollection = new Collection<IWidget>();
CogCollection = new Collection<ICog>();
foreach (var w in widgets)
{
WidgetCollection.Add(w);
}
foreach (var c in cogs)
{
CogCollection.Add(c);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这个构造函数工作正常,直到cogCollection添加了一个子集合,现在我收到了上面的错误.具体的cog类看起来像这样:
[Serializable]
public class …Run Code Online (Sandbox Code Playgroud) 我试图在我的应用程序中设置显示延迟.运行程序后,消息显示正确,而不是仅显示4秒钟.这是我的延迟功能.可能有什么不对
display(){
this.foodservice.getFood()
.subscribe(data =>
{
delay (4000)
this.display =""
});
}
Run Code Online (Sandbox Code Playgroud) 我使用一些非常基本的Javascript编写了一个标签系统,它在IE 8中像一个冠军一样运行但是,在FireFox 3中,我即将推出.相关的HTML如下:
<div id="tabs">
<ul class="tabs">
<li class="current"><a><span>News</span></a></li>
<li><a><span>Videos</span></a></li>
<li><a><span>Photos</span></a></li>
<li><a><span>Twitter</span></a></li>
</ul>
</div>
Run Code Online (Sandbox Code Playgroud)
然后,在页面加载时,我被放入这个方法:
function processTabs(TabContainer, PageContainer, Index) {
var tabContainer = document.getElementById(TabContainer);
var tabs = tabContainer.firstChild;
var tab = tabs.firstChild;
var i = 0;
.... more code }
Run Code Online (Sandbox Code Playgroud)
其余的代码在这一点上并不重要,因为它永远不会被调用.tabContainer已正确设置为使用ID选项卡引用div.现在,在我调用tabContainer.firstChild的Internet Explorer中,变量'tabs'引用我的UL,然后调用var tab = tabs.firstChild; 引用我的第一个LI.问题是,当我调用tabContainer.firstChild时,Venkman告诉我它正在返回.所以firefox正在读取我作为div中真实孩子的新行!我的UL实际上是childNodes集合中的第二个孩子!
有没有什么办法解决这一问题?
谢谢!
我正在使用Microsoft TFS API,其中一个接口上的某个属性已标记为已过时,它指示我使用其他属性.不幸的是,API要我使用的属性由TFS2010而不是TFS2008使用.
我试过这样做:
#pragma warning disable 0612, 0618
request.CommandLineArguments = arguments;
#pragma warning restore 0612, 0618
Run Code Online (Sandbox Code Playgroud)
但我仍然得到CommandLineArguments已经过时的错误.反正有压制这个吗?
编辑
不幸的是,这并没有显示为"警告错误",实际上在我的项目中关闭了警告错误.以下是违规代码的屏幕上限以及错误列表

编辑2:
使用ILSpy后,CommandLineArguments属性在TFS2010 API中如下所示:
[Obsolete("This property has been deprecated. Please remove all references. To pass command line arguments to MSBuild.exe, set the ProcessParameters property.", true)]
string CommandLineArguments
{
get;
set;
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,我认为没有办法告诉编译器忽略Obsolete属性导致的错误.
编辑3正如@Peter Ritchie指出的那样,这个值可以通过反射来设定.我想通过这个问题虽然我的猜测是,如果微软将属性设置为抛出异常,即使你通过反射设置它,我怀疑该值会被引用到任何地方.
我有一个数据库,从旧的SQL Server 2008R2实例移动到SQL Server 2012 AlwaysOn群集.数据库中有几个字段使用SQL Server内置加密功能(主密钥,证书,对称密钥)进行加密.
我在QA AO实例上运行了以下命令(与旧服务器上运行的步骤相同):
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password'
CREATE CERTIFICATE myCert
WITH SUBJECT = 'password'
CREATE SYMMETRIC KEY myKeyName
WITH ALGORITHM = TRIPLE_DES
ENCRYPTION BY CERTIFICATE myCert
Run Code Online (Sandbox Code Playgroud)
另外,我必须运行以下命令才能正确解密数据:
OPEN MASTER KEY DECRYPTION BY PASSWORD = 'password'
ALTER MASTER KEY ADD ENCRYPTION BY SERVICE MASTER KEY
Run Code Online (Sandbox Code Playgroud)
当我运行此命令时,我会看到所有解密的数据:
OPEN SYMMETRIC KEY myKeyName
DECRYPTION BY CERTIFICATE myCert
select TOP 1000 userid, CONVERT(nVARCHAR(255),DECRYPTBYKEY(password)) from users
CLOSE SYMMETRIC KEY myKeyName
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.但是,如果我在生产AO群集上运行这些相同的步骤,则此查询:
select TOP 1000 userid, CONVERT(nVARCHAR(255),DECRYPTBYKEY(password)) …Run Code Online (Sandbox Code Playgroud) 我一直在用我的头撞墙两天,希望有人可以帮我一把.我所拥有的是使用WCF编写的RESTful Web服务; 实际上只有两个接受单个字符串参数并返回字符串的方法.参数和返回值都是直接的XML.
[ServiceContract]
public interface IService
{
[OperationContract]
[WebGet(UriTemplate = "/method1/{data}", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Xml, RequestFormat = WebMessageFormat.Xml)]
string Method1(string data);
[OperationContract]
[WebGet(UriTemplate = "/method2/{data}", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Xml, RequestFormat = WebMessageFormat.Xml)]
string Method2(string data);
}
Run Code Online (Sandbox Code Playgroud)
为了论证,我们可以说这两种方法的实现如下所示:
public string Method1(string data)
{
return string.Format("You entered: {0}", data);
}
Run Code Online (Sandbox Code Playgroud)
如果我转到http://myuri.com/service.svc/method1/foo,则会向浏览器写入以下内容:
<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">You
entered: foo</string>
Run Code Online (Sandbox Code Playgroud)
这很好用,但如果我将网址更改为:http://myuri.com/service.svc/method1/ <foo>我收到400(错误请求).所以我使用以下代码启用了一些跟踪器以查看发生了什么:
<system.diagnostics>
<sources>
<source name="System.ServiceModel"
switchValue="All">
<listeners>
<add name="traceListener"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData= "c:\Traces.svclog" />
</listeners>
</source>
</sources>
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我使用切换值'All'来捕获在执行此服务期间发生的每个事件.我使用URL格式跑回了几次,这种格式可以验证跟踪器是否正常工作.然后我转到包含XML标记foo的URL并按预期收到400错误,但是当我回到日志文件时,没有附加信息附加到它的末尾.这使我相信在调用WCF服务之前显示400错误.
最后,我将方法从'GET'方法切换到'POST'方法,使用WebRequest/WebResponse写了一些具有相同结果的代码.现在我已经阅读了一些帖子,谈论在客户端使用XmlSerializer将数据发送到服务但是这违背了这项服务的目的.当我使用.NET编写服务时,很可能PHP或经典ASP脚本将连接到此服务,显然,他们无法访问XmlSerializer.
所以我的百万美元问题是:是否可以向WCF中开发的RESTful Web服务发送"原始"XML请求,如果是,如何?
PS进入和退出服务的XML不是基于任何有形对象,它只是我创建的用于此服务的结构.进入的XML通过XPath进行解析,将值放入更大的XML字符串中,并传递给外部API.该API的结果将被处理,然后由我的RESTful服务返回. …
我试图从TFS获得一个特定的构建,但它是令人沮丧的困难.我有一个MVC应用程序触发这样的构建:
IBuildServer buildServer = (IBuildServer)Server.GetService(typeof(IBuildServer));
IBuildDefinition def = buildServer.GetBuildDefinition(TeamProject, BuildDefinition);
var queuedBuild = buildServer.QueueBuild(def);
Run Code Online (Sandbox Code Playgroud)
QueueBuild返回IQueuedBuild,我希望这样做:
return queuedBuild.Build.BuildNumber
Run Code Online (Sandbox Code Playgroud)
这样我就可以使用一些独特的值来查询构建服务器以获得正确的构建.不幸的是,当执行退出此方法时,Build可能为null也可能不为null,因此这是不行的.
在构建排队后,我然后轮询此方法
public string GetBuildStatus(string TeamProject, string BuildDefinition, string BuildNumber)
{
string status = string.Empty;
IBuildDetailSpec buildDetailSpec = buildServer.CreateBuildDetailSpec(TeamProject, BuildDefinition);
buildDetailSpec.MaxBuildsPerDefinition = 1;
buildDetailSpec.Status = BuildStatus.InProgress | BuildStatus.None;
buildDetailSpec.QueryOrder = BuildQueryOrder.FinishTimeDescending;
IBuildQueryResult queryResult = buildServer.QueryBuilds(buildDetailSpec);
if (queryResult.Builds.Length > 0)
{
status = queryResult.Builds[0].Status.ToString();
}
return status;
}
Run Code Online (Sandbox Code Playgroud)
这在某种程度上有效,但如果队列中有多个构建,我无法知道这个轮询方法,如果我正在使用的构建是我在第一个方法中排队的构建.有没有人知道我可以做些什么来取回在第一种方法中排队的特定构建?
谢谢!
我目前正在进行TFS 2008至2012升级.这是我的情况:我当前的TFS 2008盒子是带有SQL Server 2005后端的Server 2K3.我不完全确定我的升级路径是什么,但我认为以下两种情况最有可能:
网络人员真的希望我做选项2,因为他们想要淘汰Server 2003盒子,但我担心的是如何将TFS 2008中的所有数据都提供给TFS 2012实例?我查看了MSDN和Google,但我没有遇到任何解释如何进行此类升级的文档.
另外,我应该注意哪些陷阱?
任何帮助将不胜感激!
尽管在Windows应用程序中做了类似的事情,但我在这方面做得很糟糕.我正在研究WPF应用程序(Prism,Unity,MVVM),我刚刚完成了登录视图.一旦针对SQL Server中的表验证了用户的凭据,我就这样做:
Thread.CurrentPrincipal = user.GenericPrincipal();
Run Code Online (Sandbox Code Playgroud)
用户类定义如下:
public class ApplicationIdentity : GenericIdentity, IApplicationIdentity
{
public string UserName { get; set; }
public bool Authenticated { get; set; }
public ICollection<IModuleProperties> Modules { get; set; }
public ICollection<IViewProperties> Views { get; set; }
public ApplicationIdentity(string userName, IAuthenticatedUser authenticatedUser)
: base(userName)
{
UserName = userName;
Authenticated = authenticatedUser.Authenticated;
Modules = authenticatedUser.Modules;
Views = authenticatedUser.Views;
}
public IPrincipal GenericPrincipal()
{
return new GenericPrincipal(this, null);
}
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,在登录屏幕被解除后几乎立即我打这个电话:
var currentUser = (IApplicationIdentity)Thread.CurrentPrincipal.Identity;
Run Code Online (Sandbox Code Playgroud)
这引发了一个异常,即Identity无法转换为类型IApplicationIdentity,我不确定我缺少什么.到目前为止,我所阅读的所有SO/Google文章都通过针对AD验证用户来解决了这个问题,但这在我的场景中不起作用.
我试图在这里解决的问题只是坚持当前登录的用户以及他们应该有权访问的模块和视图.如果在设置CurrentPrincipal之外有更好的方法来实现这一点,我对其他解决方案完全开放.感谢您提供的任何帮助!
编辑(解决方案): …
这个问题的变体已经被问到了所有的问题,通过这些问题,我已经能够以 90% 的方式获得我的配置,但我仍然遇到了一些问题。我的设置如下所示:
(http://server1)
----------------
--> -- webserver1 --
/ ----------------
/
(https://externaldomain)/
---------------------- /
--- load balancer ----
---------------------- \
\
\
\ (http://server2)
--> ----------------
-- webserver2 --
----------------
Run Code Online (Sandbox Code Playgroud)
我已经指定
<useRequestHeadersForMetadataAddress>
<defaultPorts>
<add scheme="https" port="443" />
</defaultPorts>
</useRequestHeadersForMetadataAddress>
Run Code Online (Sandbox Code Playgroud)
我已经设置httpGetEnabled为 false 和httpsGetEnabledtrue。结果是,当我导航到https://externaldomain我看到默认服务屏幕时,它显示了正确的 URL,例如 svcutilhttps://externaldomain/svc.cs?wsdl
我有两个问题:
https://externaldomain/svc.cs?wsdl未显示的 WSDL,则会被重定向回默认服务屏幕。我仍然可以通过以下方式在 Visual Studio 中添加对此服务的引用:https://externaldomain/svc.cs/mex,但我希望 WSDL 也可用。有人可以指出我需要更改什么来解决这两个问题的一些文档的方向吗?我的服务的配置如下。
<system.serviceModel>
<client> …Run Code Online (Sandbox Code Playgroud) 我看了很多关于SO和的NuGet的答案(和一般的上网,真的),但我似乎无法克服我与NuGet包有问题恢复在Visual Studio 2015年,我有以下的情况.
解决方案A结构
- 项目A.
如果我打开并构建解决方案AI,请参阅显示nuget包恢复进度的对话框,并成功构建解决方案.
解决方案B结构
- 项目A.
- 项目B
但是,假设我从来没有构建的解决方案A(TFS从新鲜即拉),如果我打开和构建BI解决方案看到对话框,显示了NuGet包还原进度,但由于项目A构建失败构建失败.
似乎正在发生的是NuGet正在恢复项目B的软件包,但不是项目A,因此构建失败.到目前为止,如果我查看项目B的引用,所有NuGet引用都已解析,但项目A的引用仍然被破坏.
几点:
我们将非常感谢您的想法.
我正在使用ReportViewer控件和自定义打印作业工作流程,这会导致一些问题.我的代码看起来有点像这样:
ids.ForEach(delegate(Guid? guid)
{
var details = items.Where(e => e.guid == guid);
var ds = new ReportDataSource("Form", details);
ReportViewer.LocalReport.DataSources.Clear();
ReportViewer.LocalReport.DataSources.Add(ds);
ReportViewer.RefreshReport();
});
Run Code Online (Sandbox Code Playgroud)
当RefreshReport()最终调用它时会触发它的RenderingComplete事件,并且在那个事件中我有逻辑来排队打印作业:
if (DisplayPrintDialog) ReportViewer.PrintDialog();
else
{
var document = new PrintDocument(ReportViewer.LocalReport);
document.PrinterSettings = ReportViewer.PrinterSettings;
document.Print();
}
DisplayPrintDialog = false;
Run Code Online (Sandbox Code Playgroud)
问题是ForEach循环在RenderingComplete事件触发之前完成运行所以我需要一种方法来阻止我的ForEach循环,直到RenderingComplete事件为循环的每次传递触发.有什么好办法解决这个问题?
我有一个使用Unity for DI的应用程序但我在编写单元测试时遇到了一些麻烦.在我的一些业务层方法中,我有与此类似的代码:
var obj = container.Resolve<ISomeObj>();
Run Code Online (Sandbox Code Playgroud)
这要么是站在一个最终会传递给数据库的内存中对象,要么是最终传递给客户端的内存中对象.但问题是RhinoMocks(貌似)无法正确地模拟容器,所以做这样的事情:
mockContainer = MockRepository.GenerateMock<IUnityContainer>();
mockContainer.Expect(x => x.Resolve<ISomeObj>())
.Return(mockObj);
Run Code Online (Sandbox Code Playgroud)
在这里获得异常似乎是有道理的,因为容器实际上是空的,但我没有看到解决问题的直接方法.我曾考虑用包装器抽出容器以解决这个问题,但这似乎有点矫枉过正.
任何想法或建议都非常感谢!
- - 编辑 - -
由于Yacoub发布了他的答案,我一直在阅读有关服务定位器(反)模式的一些内容,虽然人们普遍认为这是一种反模式,但我还没有找到关于如何处理POCO的答案.
使用上面的例子,似乎我的问题的一般答案是做这样的事情:
public class Foo()
{
private ISomeObj someObj;
public Foo(ISomeObj injectObj)
{
someObj = injectObj;
}
}
Run Code Online (Sandbox Code Playgroud)
我认为我对此方法的唯一抱怨是它(可能)使构造函数"忙"ala:
public class Foo()
{
public Foo(ISomeService injectSvc, ISomeObj injectObj, ISomeObj2 injectObj2, ISomeObj3 injectObj3)
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
此外,除非我遗漏了某些内容,否则我需要一种方法来重新初始化给定的实例以供重用.含义:如果MethodA()和MethodB()都使用了ISomeObj,当MethodA()完成ISomeObj时,我需要重新初始化ISomeObj中的所有字段,以便MethodB()可以完成它的工作.
解决这个问题的"最佳"方法是什么?
c# unit-testing dependency-injection rhino-mocks unity-container
c# ×9
tfs ×2
wcf ×2
.net ×1
alwayson ×1
angular ×1
encryption ×1
firefox ×1
https ×1
javascript ×1
json ×1
json.net ×1
mvvm ×1
nuget ×1
rest ×1
rhino-mocks ×1
sql-server ×1
tfs2008 ×1
tfs2012 ×1
unit-testing ×1
web-services ×1
wpf ×1
wsdl ×1