我在C#中有几个.NET应用程序,以及一个用于访问数据库的API.我想将所有版本的API放在数据库中,让他们选择最高版本和内部版本号,但要坚持使用它们构建的主要和次要编号.基本上,当我引用API时,1.2.3.4我希望引用读取,1.2.*.*以便应用程序只需要提取,1.2.3.5我看到我可以使用XML配置文件执行此操作.我宁愿让它遵守.类似于发布策略,但没有额外的文件.我可以满足于此.另一个问题是我看到的所有解决方案都将一个版本重定向到另一个特定版本,而不仅仅是更新版本.
我该怎么做呢?
有人能指出我对出版商政策的信息来源吗?
我打算建立一个网络服务,或通过互联网公开的其他服务.我想为应用程序创建一个API来与此服务进行交互.我希望API可以在不同的语言中使用,例如Java,C++,C#或PHP.如何为我的API维护一个代码库,但为所有这些语言分发好的打包二进制文件?另外,我可能想要考虑这也可能是跨平台的.
更新1
我刚开始使用Web服务,但我认为其中一个关键点是,许多工具支持基于WDSL等服务描述实现客户端.我没有提供任何我做过的客户端软件,我希望任何用户都能够构建适合他们需求的客户端.--Brabster的答案
我不反对将它作为一个直接的Web服务,然后发出一个WSDL文件.但是,如果我希望客户端API执行某些逻辑,加密,错误检查等,该怎么办?
更新2
至于期望使用您的API的客户端做任何事情,您不能!您无法做任何事情来确保API的使用者能够做任何事情.这就是强大的错误处理如此重要的原因.您必须检查并仔细检查来自客户端的任何内容和所有内容.你必须始终怀疑它,甚至认为它是恶意的.这个事实真的没有好办法.--Ryan Guill的回答
我最初的想法是在.NET中创建一个DLL或程序集,然后客户端调用这个运行客户端的代码.此代码可以通过任何通信协议与服务器通信,但我的API将在其盒子上运行.我想REST并没有真正做到这一点.似乎在REST中,一切仍然是HTTP帖子.这几乎是肥皂的网络服务.
更新3
我接受了Ryan Guill的回答.我认为一般的想法是我需要暴露某种类型的网络服务,对客户端的阻碍最小.这样任何人都可以连接.然后让我的所有代码都在服务器上运行.这似乎被认为是唯一想要真正实现我所追求的平台和语言独立性的人.
感谢所有的投入.
我在看JDM.这只是一个与其他工具进行实际数据挖掘的API吗?或者这是一组包含实际数据挖掘算法的包吗?
我想在类上使用条件属性,或者更重要的是,是否存在可以产生这种效果的东西?基本上我不希望类在调试模式下存在.我也不想在#if DEBUG指令中包装每个调用.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
namespace NameSpace
{
[Conditional("Debug")]
public class ClassName
{
public ClassName()
{
}
}
}
Run Code Online (Sandbox Code Playgroud) 我从C#方法抛出异常,它将通用列表作为参数.
private static void DoWork(List<ClassName> a)
{
}
Run Code Online (Sandbox Code Playgroud)
当它抛出异常时,堆栈跟踪显示"1"而不是列表的类名.为什么是这样?这就是堆栈跟踪的含义.
...
at DoWork(List`1 a).
...
Run Code Online (Sandbox Code Playgroud) 我想在我的Linq表类中实现这个部分方法.
partial void OnValidate(System.Data.Linq.ChangeAction action);
Run Code Online (Sandbox Code Playgroud)
我希望是在插入之前调用它.什么人可以告诉我何时调用OnValidate方法?
更新1
我知道我可以查看枚举,看看是什么动作导致它被触发.但何时调用它呢?我需要知道每次有人提交更改或者什么时会调用它吗?
我有一些代码,
int count = 0;
list.ForEach(i => i.SomeFunction(count++));
Run Code Online (Sandbox Code Playgroud)
这似乎不会增加计数.计数是否按此值传递?如果我在lambda中使用{}有什么区别吗?
int count = 0;
list.ForEach(i =>
{
i.SomeFunction(count++);
});
Run Code Online (Sandbox Code Playgroud)
更新1
对不起,我的错误,它确实更新了原始计数.
(这本来是一个普遍的假设性问题,我抱怨说.NET是一只猪并且乞求理由.这并不是关于我的特定应用程序的问题.)
目前我正在用C#重写一些旧的C++代码.我们正在移植所有遗留应用程序.我有C++应用程序,占用MAX 3%CPU.他们大多没有使用.然后我接受代码,复制和粘贴,然后重新格式化为C#语法和.NET库,以及BAM!50%的CPU.这是什么原因?我一开始认为它是JIT,但即使在每个代码路径都进行了练习之后,整个事情也被JIT编辑,同样的问题.
我也注意到了大量的内存增加.花费9 MB运行满载的应用程序现在从10 MB开始,运行速度为50 MB.我意识到硬件很便宜,但我想了解导致这种情况的原因.它是引起恐慌的原因,还是.NET就像猪一样?
更新1对Skeet的回答
我熟悉C#.我将事情改为Linq,依此类推.我通常采用代码并减少行数,依此类推.你能举一些C++人在.NET中做错的例子吗?
更新2
这是一个普遍的问题,但具有该问题的具体应用程序如下.
它有一个线程使用和ODBC驱动程序从一个paradox数据库中获取数据.然后它使用Linq将其转换为SQL db并发布它.我通过ANTS分析器运行它,似乎数据集填充花费的时间最多.其次是Linq发帖.我知道我的一些领域是反射用法,但我不知道怎么做我需要的东西.我计划将我的字符串更改为字符串构建器.这两者有什么区别吗?
(int)datarow["Index"]
Run Code Online (Sandbox Code Playgroud)
和
ConvertTo.Int32(datarow["Index"])
Run Code Online (Sandbox Code Playgroud)
我更改了所有字符串连接以格式化字符串.这并没有减少头脑.有没有人知道数据读取器与数据适配器和数据集之间的区别?
我有这个代码.
byte dup = 0;
Encoding.ASCII.GetString(new byte[] { (0x80 | dup) });
Run Code Online (Sandbox Code Playgroud)
当我尝试编译时,我得到:
无法将类型'int'隐式转换为'byte'.存在显式转换(您是否错过了演员?)
为什么会这样?不应该| 两个字节给出一个字节?以下两项工作,确保每个项目都是一个字节.
Encoding.ASCII.GetString(new byte[] { (dup) });
Encoding.ASCII.GetString(new byte[] { (0x80) });
Run Code Online (Sandbox Code Playgroud) 我期待加密数据.我想基于密码生成加密密钥,以及一些移动值,如时间.目标是进行密钥更改,但让知道密码的任何人都能够解密.这发生在C#中.我使用以下代码来哈希密码.
private static string GetPasswordHash(string password)
{
TimeSpan span = (DateTime.UtcNow - new DateTime(1900, 1, 1));
string result = Convert.ToInt32(span.TotalHours).ToString();
result += password;
result += Convert.ToInt32(span.TotalDays).ToString();
result = Convert.ToBase64String(SHA256.Create().ComputeHash(Encoding.ASCII.GetBytes(result)));
return result;
}
Run Code Online (Sandbox Code Playgroud)
然后我使用该哈希,加上盐来生成密钥.
Rfc2898DeriveBytes rdb = new Rfc2898DeriveBytes(GetPasswordHash(password), salt);
rdb.IterationCount = 1000;
RijndaelManaged rm = new RijndaelManaged();
rm.KeySize = 256;
rm.Key = rdb.GetBytes(32);
rm.IV = rdb.GetBytes(16);
Run Code Online (Sandbox Code Playgroud)
我这样做的方式似乎有问题.有些计算机位于不同的时区,或者当我发送数据时小时计时,或者机器时间稍微偏离.有更好的建议吗?
c# ×6
.net ×4
api ×2
assemblies ×1
byte ×1
cpu-usage ×1
data-mining ×1
debugging ×1
delegates ×1
encryption ×1
exception ×1
generics ×1
java ×1
lambda ×1
linq ×1
logic ×1
partial ×1
passwords ×1
performance ×1
reference ×1
stack-trace ×1
timezone ×1
types ×1