鉴于以下webapiconfig;
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
Run Code Online (Sandbox Code Playgroud)
和这个控制器;
public class ProductsController : ApiController
{
Product[] _products = new Product[]
{
new Product { Id = 1, Name = "Tomato Soup", Category = "Groceries", Price = 1 },
new Product { Id = 2, Name = "Yo-yo", Category = "Toys", Price = 3.75M },
new Product { Id = 3, Name = "Hammer", Category = "Hardware", Price = 16.99M }
};
public IEnumerable<Product> GetAllProducts() …Run Code Online (Sandbox Code Playgroud) c# asp.net-mvc asp.net-mvc-routing wcf-web-api asp.net-web-api
我想做一个简单的多种类型注册解决方案(最终注入构造函数,但使用.Resolve来查看Unity是否能够执行此类操作.
在下面的每种情况下,Unity都会解析0应该解决的项目2.
是否有一些团结的转变可以打开2007年后的行为?还是我只是大失所想?
这是我的代码:
public interface IFoo {}
public class Foo1 : IFoo{}
public class Foo2 : IFoo{}
class Program
{
static void Main(string[] args)
{
var container = new UnityContainer();
container.RegisterType<IFoo, Foo1>();
container.RegisterType<IFoo, Foo2>();
// container.Resolve<IEnumerable<IFoo>>(); returns 0
// container.ResolveAll<IFoo>(); returns 0
var foos = container.Resolve<IFoo[]>();
Console.WriteLine(foos.Count());
Console.ReadLine();
}
}
Run Code Online (Sandbox Code Playgroud) 我从标准的MVC 4 WebApi项目获得以下响应;
<ArrayOfProduct xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Product>
<Id>1</Id>
<Name>Tomato Soup</Name>
<Category>Groceries</Category>
<Price>1</Price>
</Product>
</ArrayOfProduct>
Run Code Online (Sandbox Code Playgroud)
我试图让它返回
<Products>
<Product>
<Id>1</Id>
<Name>Tomato Soup</Name>
<Category>Groceries</Category>
<Price>1</Price>
</Product>
</Products>
Run Code Online (Sandbox Code Playgroud)
我发现许多参考各种方法可以解决这个问题,没有工作;
更改默认序列化程序不起作用.
创建客户序列化程序Product不起作用.
创建List<Product>使用适当的XmlRoot和XmlElement属性公开的新类不起作用.
添加Datacontract属性不起作用.
添加CollectionDatacontract属性不起作用.
这对其他人来说似乎很简单,除了我!
我有一个在本地工作正常的构建,但是,不会在我们的TFS环境中构建.
我收到以下错误;
C:\ Windows\Microsoft.NET\Framework64\v4.0.30319\Microsoft.Common.targets(1578):无法解析此引用.无法找到程序集"Assembly.Services.Common".检查以确保磁盘上存在程序集.如果您的代码需要此引用,则可能会出现编译错误.
有问题的组件被检入TFS并位于以下位置;
/Root/BaseBinRefs/Assembly.Services.Common.dll
它在.net框架之外没有任何外部引用.
未能构建的项目位于TFS中的以下位置
/根/服务/ AssemblySolutionFolder/AssemblyThatIsFailing
在解决方案中的项目中引用程序集,并且程序集的HintPath看起来是正确的;
<Reference Include="Assembly.Services.Common, Version=1.0.0.0,
Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\BaseBinRefs\Assembly.Services.Common.dll</HintPath>
</Reference>
Run Code Online (Sandbox Code Playgroud)
如上所述,它在本地构建,我没有理由认为它应该在TFS内失败.需要注意的是,我对TFS一般是新手,并且仍然试图将我们的第一个项目集成到这个环境中.
更新1
使用ProcessMonitor,我看到TFS尝试从中加载文件;
C:\构建\ 1\ROOT\BaseBinRefs\Assembly.Services.Common.dll
哪个不存在,但在相对意义上是正确的.现在,当我查看Sources目录时,我看到包含Assembly.Services.Common.dll的BaseBinRefs,所以它已经下载了它们(我将BaseBinRefs添加到构建定义中)
我有一个ASP.Net C#应用程序,需要每5分钟使用WebServices连接到一个外部API.
外部Web服务的要求如下:
我已经建立了以前的所有,但我目前有一个问题.存储当前和历史密码的最佳做法是什么?
显然,存储明文密码是一个糟糕的解决方案.我需要能够让我的web服务读取密码并随每个请求一起传输.我还需要能够访问所有历史密码,以确保我新生成的密码不重复.
理想情况下,我想将每个(加密的)密码存储在我的数据库中,并在需要调用Web服务时对其进行解密.我应该遵循最佳做法吗?我应该使用Microsoft.Practices.EnterpriseLibrary.Security.Cryptography.Cryptographer.EncryptSymmetric(..)加密每个密码吗?
注意:不幸的是,我无权更改外部API的功能.我必须遵守所提供的规则.
我希望实现一个系统,用于"构建"条件,然后从数据库返回结果数据.目前,有一个存储过程可以动态生成SQL并执行它.这是我想要删除的特殊问题.
我的问题来自这样一个事实:我可以在我的标准中包含多个字段,并且对于每个字段,可能有一个或多个值,具有不同的潜在运算符.
例如,
from t in Contacts
where t.Email == "email@domain.com" || t.Email.Contains ("mydomain")
where t.Field1 == "valuewewant"
where t.Field2 != "valuewedontwant"
select t
Run Code Online (Sandbox Code Playgroud)
字段,标准和运算符存储在数据库(和List<FieldCriteria>)中,并且可能是这样的(基于上面);
Email, Equals, "email@domain.com"
Email, Contains, "mydomain" Field1,
Equals, "valuewewant" Field2,
DoesNotEqual, "valuewedontwant"
Run Code Online (Sandbox Code Playgroud)
要么
new FieldCriteria
{
FieldName = "Email",
Operator = 1,
Value = "email@mydomain.com"
}
Run Code Online (Sandbox Code Playgroud)
因此,使用我拥有的信息,我希望能够构建具有任意数量条件的查询.我之前看到过Dynamic Linq和PredicateBuilder的链接,但我无法将其视为我自己问题的解决方案.
任何建议,将不胜感激.
更新
继关于Dynamic Linq的建议之后,我提出了一个非常基本的解决方案,使用单个运算符,具有2个字段和多个条件.目前在LinqPad中编写的有点粗略,但结果正是我想要的;
enum Operator
{
Equals = 1,
}
class Condition
{
public string Field { get; set; }
public Operator Operator { …Run Code Online (Sandbox Code Playgroud) 以下代码似乎不起作用.如果该地址不存在,则不会插入新记录.但是,如果地址确实存在,则会更新.
ALTER PROCEDURE [Users].[UpdateAddress]
@UserId int,
@Address1 varchar(100),
@Address2 varchar(100),
@Town varchar(100),
@County varchar(50),
@PostCode varchar(50),
@Country varchar(50),
@Type INT
AS
MERGE [Users].[Addresses] AS Target
USING (SELECT UserId FROM [Users].[Addresses] WHERE UserId = @UserId) AS Source
ON (Source.UserId = Target.UserId)
WHEN MATCHED THEN
UPDATE SET Target.Address1 = @Address1,
Target.Address2 = @Address2,
Target.Town = @Town,
Target.County = @County,
Target.Postcode = @Postcode,
Target.Country = @Country
WHEN NOT MATCHED BY TARGET THEN
INSERT ([UserId], [Address1], [Address2], [Town], [County], [PostCode], [Country], [Modified], [Type])
VALUES(@UserId, …Run Code Online (Sandbox Code Playgroud) 我有一个包含3个项目的复选框列表.我想将复选框列表的所有选中值都放到一个字符串中.我尝试了以下代码,但它没有给出正确的结果.任何人都可以帮助我.
<asp:checkboxlist id="interestedIN" runat="server" repeatlayout="table"
cellspacing="3" cellpadding="3" Font-Size="12px">
<asp:ListItem id= "social" runat="server" text=" Sociology" Selected="false" />
<asp:ListItem id="zoo" runat="server" text=" Zoology " Selected="false" />
<asp:ListItem id="math" runat="server" text=" mathematics " Selected="false" />
</asp:checkboxlist>
Run Code Online (Sandbox Code Playgroud)
这是C#i实现的:
foreach (ListItem li in interestedIN.Items)
{
if (li.Selected)
{
interestIN = interestedIN.SelectedItem.Value + "," + interestIN;
}
}
Run Code Online (Sandbox Code Playgroud)
输出:如果用户选择社会学和动物学,我希望输出为"社会学,动物学"但我的上述代码给了我以下结果"社会学,社会学".
这可能是一个梦想,但我希望有人知道一个工具,可以配置为比较两个相同数据库中的数据的所有或一些(键)并合并,可能基于关系.
专门为SQL Server寻找一个.
我并不是真的要求最好的一个,但如果它存在,那么听听它是如何被使用会很好.
关于如何管理已完成的工作或在开发中添加数据并将其推送到生产而不复制整个数据库的任何其他想法都是受欢迎的.
谢谢!
我定义了以下类;
Data.Models.Lists.List
Infrastructure.Models.Lists.List
Run Code Online (Sandbox Code Playgroud)
两者都包含以下字段;
public int Id { get; set; }
public string Description { get; set; }
Run Code Online (Sandbox Code Playgroud)
我也定义了这个视图模型;
public class IndexViewModel
{
public IEnumerable<Infrastructure.Models.Lists.List> Lists { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在我的 Automapper 配置中,我只是执行以下操作;
cfg.CreateMap< Data.Models.Lists.List, Infrastructure.Models.Lists.List>()
Run Code Online (Sandbox Code Playgroud)
我认为这就足够了,但我还添加了这个;
cfg.CreateMap<IEnumerable<List>,Models.Lists.IndexViewModel>();
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试映射控制器中的项目时;
var items = ListsService.GetLists(CurrentPrincipal.Id);
var model = Mapper.Map<IndexViewModel>(items);
Run Code Online (Sandbox Code Playgroud)
model.Lists 始终为 null,尽管 items 有 22。还需要添加什么才能使此映射正常工作?
我有许多连接的表,并且最大行数约为 400 万条记录。我们正在存储过程中搜索此表,并且有一个默认值为 NULL 的可选参数,下面是我们正在运行的编辑示例,连接中涉及更多表,但只有 1 个字段具有 WHERE 子句;
DECLARE @OwnerId VARCHAR (50)=NULL
SET @OwnerId = 'A123456'
SELECT DISTINCT
t1.Id,
t2.OwnerId,
FROM
table1 t1
INNER JOIN [table2] t2 m ON t1.Id = t2.id
WHERE
t2.OwnerId = @OwnerId
Run Code Online (Sandbox Code Playgroud)
OwnerId 上有一个索引。运行上述查询在不到 1 秒的时间内返回结果 (600)。但是,正如所指出的,该参数是可选的(以及其他参数),只要我稍微更改它以包含该值(如果不是 NULL)(我相信这是这样做的),相同的搜索就会超过 10 秒。
SET @OwnerId = 'A123456'
SELECT DISTINCT
t1.Id,
t2.OwnerId,
FROM
table1 t1
INNER JOIN [table2] t2 ON t1.Id = t2.id
WHERE
(@OwnerId IS null OR (t2.OwnerId = @OwnerId))
Run Code Online (Sandbox Code Playgroud)
我无法在生产服务器上运行执行计划,但在开发服务器上运行时可以看到略有不同(这没有 400 万行),所以有些事情正在发生变化,但不确定是什么。
c# ×7
asp.net-mvc ×3
sql ×3
sql-server ×3
asp.net ×2
automapper ×1
build ×1
database ×1
dynamic ×1
linq ×1
passwords ×1
production ×1
t-sql ×1
tfs ×1
wcf-web-api ×1
web-services ×1
xml ×1