标题太宽泛了,但我找不到更具体的,请随时更换更好的。
我有一个使用序列而不是身份的表。我有三个同时插入表的生产者应用程序,一个消费者应用程序从未处理状态的表中选择,然后处理它们,最后更新已处理的行。
消费者应用程序有一个规则,它不处理 id(标识列值)小于最后自己处理的 id 的行。
问题是,虽然我从未假设会发生,但我的消费者应用程序在运行时会落入此规则。(为其他目的制定的规则)。形象化;
每个应用程序都会向数据库发送新数据,在正常情况下,每个应用程序都应该由消费者选择并处理(轮询),但是有时(在工作期间内)我的表中总是有未处理的数据。
这里我的insert sp长什么样子,是生产者常用的;
CREATE PROCEDURE spInsData
@Data VARCHAR(MAX)
AS
BEGIN
SET @Id = NEXT VALUE FOR dbo.sequenceId
INSERT INTO dbo.MyTable(Id, Data, Status)
VALUES (@Id, @Data, 0)
END
Run Code Online (Sandbox Code Playgroud)
所以我在想,生产者2和生产者3调用存储过程的时候,他们首先拿到的是序列值。然后,当涉及到插入时,不知何故,生产者 3 的插入发生得比生产者 2 快。然后消费者在较小的 id 之前处理较大的 id,因此永远不会处理 id 26。
我希望我清楚这个问题。可能是我解释的问题还是其他问题?如果是关于序列,我可以为每个消费者锁定整个过程 - 获取序列并插入吗?
我有一个程序如下
class Program
{
public static int TaskCount { get; set; }
public static BlockingCollection<string> queue = new BlockingCollection<string>(new ConcurrentQueue<string>());
static void Main(string[] args)
{
TaskCount = 3;
Task.Factory.StartNew(() => Producer());
for (int i = 0; i < TaskCount; i++)
Task.Factory.StartNew(() => Consumer());
Console.ReadKey();
}
private static void Producer()
{
using (StreamWriter sw = File.AppendText(@"C:\pcadder.txt"))
{
for (int i = 0; i < 15; i++)
{
queue.Add("Item: " + (i+1).ToString());
var message = string.Format("{2}.Item added: Item {0} at {1}", (i+1).ToString(), …
Run Code Online (Sandbox Code Playgroud) 我的应用程序中具有从基本实体派生的实体,该基本实体使用ef核心代码优先方法。
基类
public abstract class BaseEntity<T> : IEntity<T>
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public T Id { get; set; }
object IEntity.Id { get { return Id; } set { } }
private DateTime? createdOn;
[DataType(DataType.DateTime)]
public DateTime CreatedOn { get => createdOn ?? DateTime.Now; set => createdOn = value; }
[DataType(DataType.DateTime)]
public DateTime? ModifiedOn { get; set; }
public bool IsDeleted { get; set; }
// Auto increment for all entities.
public int OrderId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
和一个实体
public …
Run Code Online (Sandbox Code Playgroud) 我有一个http可调用的wcf服务方法;
[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "/CheckHMAC/{hMac}")]
public string CheckId(string Id)
{
Result result = new Result() { OTP = 1, IsSuccessful = false, CustomerId = "" };
return JsonConvert.SerializeObject(result);
}
Run Code Online (Sandbox Code Playgroud)
该方法产生如下输出:
"{\"IsSuccessful\":false,\"OTP\":1,\"CustomerId\":\"\"}"
使用此方法的客户端抱怨此格式,因为它无效,我已经用另一个客户端测试了它,是的,它似乎无效。到目前为止,我从未遇到过这样的问题,输出应该很容易反序列化,为什么 json 对象用双引号引起来?如何获取有效的 json 字符串?
{"IsSuccessful":false,"OTP":1,"CustomerId":""}
我有json如下,
{
"H": "Macellum",
"M": "Receive",
"A": [
{
"CustomerId": "172600",
"OrderId": "69931",
"OrderStatus": "E0",
"Buy": "A"
}
]
}
Run Code Online (Sandbox Code Playgroud)
和复杂的类型
public class OrderStats
{
public string CustomerId { get; set; }
public string OrderId { get; set; }
public string OrderStatus { get; set; }
public string Buy { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试铸造如下,
dynamic obj = JsonConvert.DeserializeObject<dynamic>(message);
OrderStats info = (OrderStats)obj.A[0]; //exception
OrderStats info = obj.A[0] as OrderStats; //info is null
Run Code Online (Sandbox Code Playgroud)
但错误如下
无法将类型'Newtonsoft.Json.Linq.JObject'转换为OrderStatus
我有一个桌面应用程序,应该在任何表更改时收到通知。因此,我只找到了两个非常适合我的情况的解决方案:SqlDependency和SQLCLR。(我想知道 .NET 堆栈中是否有更好的)我已经构建了两个结构并使它们工作。我只能比较从 SQL Server 到客户端的 s̲i̲n̲gl̲e̲ 响应的持续时间。
持续时间:从 100 毫秒到 4 秒
持续时间:从 10ms 到 150ms
我希望这个结构能够处理高速率通知*,我已经阅读了一些 SO 和博客文章(例如:here),并且我的同事也警告说,在大量请求时 SqlDependency 可能会出错。在这里,MS 提供了一些我没有得到的东西,这可能是我问题的另一种解决方案。
*:不是所有时间,而是一个季节;在 1-2 个服务器上每秒 50-200 个请求。
基于高通知率和性能,我应该继续使用这两个中的哪一个,还是有其他选择?
我有一个ActionBlock
简单地处理来自无限循环的消息。在里面ActionBlock
我做了一个http post。当发生任何与网络相关的错误时,该方法会抛出异常并且该块会出现故障/停止。这不是我想要的行为。即使发生异常,我也希望处理运行。(继续打Process
方法)来模拟我的程序;
private static ExecutionDataflowBlockOptions processBlockOptions
{
get
{
return new ExecutionDataflowBlockOptions
{
MaxDegreeOfParallelism = 1
};
}
}
static async Start()
{
processQueue = new
ActionBlock<QueueMessage>(
async (item) =>
{
await Process(item);
},
processBlockOptions);
while (!Stopped)
{
//Read from DB and do logic with item
QueueMessage item= new QueueMessage();
await processQueue.SendAsync(item);
}
}
private async static Task<int> Process(QueueMessage item)
{
try
{
await item.HttpPost(order);
}
catch (Exception ex)
{
//Http endpoint might be …
Run Code Online (Sandbox Code Playgroud) 我花了很多时间来找出答案,但我没有。当我发布模型而未选择任何选项(实际上是选择0 - Select
-option)时,Required
验证不起作用。
我还尝试从服务代码中删除以编程方式添加的默认选项,将其从查看代码中删除,验证也没有像这样工作。
如果我完全删除了默认选项,则视图引擎会自动从列表中选择第一个选项,并且永远不会完成验证。
如何使服务器端验证正确完成?
这是我的模特
public class AuditViewModel
{
public Guid Id { get; set; }
[Display(Name = "Subject")]
[Required(ErrorMessage = "IsRequired")]
public string Subject { get; set; }
public string AuditType { get; set; }
public string LocationCountry { get; set; }
public string LocationOffice { get; set; }
[Required(ErrorMessage = "IsRequired")]
[Display(Name = "AuditType")]
public int AuditTypeId { get; set; }
public string CreatedOn { get; set; }
public …
Run Code Online (Sandbox Code Playgroud) 这是我的 wcf 服务方法:
[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "/CheckID/{id}")]
public string CheckID(string id)
{
/*Check reuqest where it comes from */
}
Run Code Online (Sandbox Code Playgroud)
如果我的方法从http://particularIP.com调用/调用,我希望我的方法发送响应正常,除非响应错误请求。
我怎样才能做到这一点?
IF(ISNUMERIC(RTRIM(LTRIM('83B1B88'))) = 0)
select CONVERT(VARCHAR, CONVERT(INT, CONVERT(VARBINARY, CONVERT(VARCHAR, '0x' + '83B1B88'), 1)))
Run Code Online (Sandbox Code Playgroud)
我不知道为什么SQL抛出错误转换数据类型为varchar到VARBINARY我得到这个例外适用于像值1B91B32
,169DF90
, 13077B5
谁能帮我吗 ?
在我的asp.net核心应用程序中,我具有依赖项类,这些依赖项类注入了几乎所有服务。因此,我想构建一个基础服务类来获取对属性的这些依赖关系,并且我的服务继承该基础服务类。
public abstract class BaseService
{
protected Foo Foo { get; set; }
protected Bar Bar { get; set; }
public BaseService(Foo foo, Bar bar)
{
Foo = foo;
Bar = bar;
}
}
public class Service : BaseService
{
public Service(IOtherDependency otherDependency) { }
public void Method()
{
var value = Bar.value;
Foo.Do(value);
}
}
Run Code Online (Sandbox Code Playgroud)
因此,对于给定的代码,它警告我使用提供的参数调用基本构造函数,但是它们是将在运行时注入的参数,我不希望这样做。如果添加无参数构造函数,它将不会调用我需要的参数化构造函数。
我不想在继承的服务中调用或定义任何在基本服务(Foo
和Bar
)中注入的类,该怎么办?
顺便说一句Foo
,如果Bar
类的寿命很重要,则将类作为单例注入到容器中。
c# ×6
sql-server ×3
json ×2
wcf ×2
asp.net-core ×1
async-await ×1
casting ×1
inheritance ×1
json.net ×1
razor ×1
select ×1
sequence ×1
signalr ×1
sqlclr ×1
task ×1
tpl-dataflow ×1
validation ×1