我有一个带可选标头的wsdl:
<s:element name="AuthIdentifier" type="tns:AuthIdentifier"/>
<s:complexType name="AuthIdentifier">
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="identifier" type="s:string"/>
</s:sequence>
<s:anyAttribute/>
</s:complexType>
Run Code Online (Sandbox Code Playgroud)
客户端使用集成软件 (tibco)连接到我的服务并声称标头是必需的,因此他必须使用空值发送它:
<Header.AuthIdentifier>
<ns0:AuthIdentifier xmlns:ns0 = "http://www.tal.com/schemas"/>
</Header.AuthIdentifier>
Run Code Online (Sandbox Code Playgroud)
如何使其成为可选项?这样他就不必发送整个标题了?有没有这样的minOccurs东西?或者它现在已经是可选的吗?
为什么在下面详述的场景中,堆栈空间在x64中增加但在x32中使用相同的代码减少?
背景:
我们的客户可以使用域语言编写脚本,该语言在运行时使用递归技术解释并在Web服务器上执行.它们可能会在抛出异常的脚本中出错,此异常会被捕获并记录.
由于这种递归技术,我们通过检查用作解释器执行脚本的堆栈空间来防止堆栈溢出异常,并在我们实际耗尽堆栈之前终止脚本.
在32位模式下,一切运行良好,当脚本编写器Exception生成错误时,它被记录,堆栈展开,在此期间堆栈上剩余的空间增加,脚本很好地终止.
在64位模式下,一切都不太好,当脚本编写Exception器生成错误时,它被记录,堆栈展开,在此期间堆栈上剩余的空间减少.这是非常糟糕的,因为有可能如果脚本碰巧使用了大量的堆栈空间并抛出然后解除堆栈并记录错误本身的行为导致StackOverflowException隐藏原始异常,软管IIS并杀死所有机上要求(坏,非常糟糕,非常糟糕).
重新创建问题:
这是一个控制台应用程序,它模拟我在生产中使用的代码,并在设置为x64时重新创建问题,并在x32中正常工作.
using System;
using System.ComponentModel;
using System.Runtime.InteropServices;
namespace ConsoleApplication16
{
class Program
{
const Int32 MaxNumberRecursions = 10;
static Int32 _currentRecursionDepth;
static UInt64 _lastSpaceUsed;
static void Main(string[] args)
{
System.Diagnostics.Debug.WriteLine(String.Format("Is64BitProcess = {0}", System.Environment.Is64BitProcess));
try
{
_lastSpaceUsed = GetStackBytesLeft();
RecurseXTimes();
}
catch (Exception e)
{
System.Diagnostics.Debug.WriteLine(e);
}
}
unsafe static void RecurseXTimes()
{
System.Diagnostics.Debug.WriteLine("--> RecurseXTimes()");
ReportStackSpaceUsage();
try
{
_currentRecursionDepth++;
if (_currentRecursionDepth > MaxNumberRecursions)
{ …Run Code Online (Sandbox Code Playgroud) 我已经使用<EmbedAllSources>csproj文件中的元素将C#源代码嵌入到可移植的PDB文件中,并且使用在PDB中使用新csproj嵌入C#源中<DebugType>embedded<DebugType>所述将pdb嵌入到程序集中
我的装配看起来像这样:
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<EmbedAllSources>true</EmbedAllSources>
<DebugSymbols>true</DebugSymbols>
<DebugType>embedded</DebugType>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)
我可以确认pdb是可移植的类型,并包含我的源代码:
根据Visual Studio 15.5的发行说明,调试器应该能够在调试期间使用这些文件:
https://docs.microsoft.com/en-us/visualstudio/releasenotes/vs2017-relnotes-v15.5#EmbeddedSource
我正在使用Visual Studio 2017(版本号15.8.8)
但是,当我F11进入我的程序集的代码时,它要求源代码:
虽然谷歌上搜索了ctaggart在讨论中的评论https://github.com/ctaggart/SourceLink/issues/192,其中说运行sourcelink print-urls将打印"embed"但是我的不是,也许这是一个暗示:
有人有这个成功的工作?如果是这样你能说出我做错了吗?
我正在尝试使用.net Core工具RC4 dotnet pack命令创建带后缀的nuget包.
我可以成功创建"MyProject.1.2.3.nupkg",但我想要"MyProject.1.2.3-beta.nupkg".
根据这里的文档--version-suffix"使用指定的字符串更新 - *包版本后缀中的星号."
我已经设法找到了dotnet pack从哪里获得它的版本--netnet pack使用msbuild在使用<version/> csproj文件中的元素的封面下.例如,<version>1.2.3</version>创建一个名为"MyProject.1.2.3.nupkg"的文件.
如果我将<version/>csproj 设置为1.2.3并指定--version-suffix beta,那么它不会附加-beta但它会构建.
如果我设置版本<version>1.2.3-*</version>然后dotnet恢复休息说'1.2.3-*'不是有效的版本字符串.
我想我很亲密; 我错了什么?
背景:有一个存储过程,它使用给定名称的临时表来"填充".该过程是通用的,因为它检查临时表的模式,然后根据模式执行不同的"东西".我知道这有点奇怪,但我不愿意改变它,因为它在大多数情况下都能正常工作,除了....
如果我有一个存储过程,它为具有相同名称的临时表创建两个不同的模式.从逻辑上讲,它只根据IF的哪个分支创建一个临时表.问题是,当SQL Server检查Sproc时,似乎它正在评估IF的两端(如果它正在检查SQL语法,这是有意义的.)
所以这个SQL失败了:
IF (1=1)
BEGIN
CREATE TABLE #test
(
a BIGINT NOT NULL,
b BIGINT NOT NULL
)
END
ELSE
BEGIN
CREATE TABLE #test
(
a BIGINT NOT NULL,
b BIGINT NOT NULL,
c BIGINT NOT NULL
)
END
--exec SomeProcedureWhichDoesStuffWith#Test
DROP TABLE #test
Run Code Online (Sandbox Code Playgroud)
出现以下错误:
消息2714,级别16,状态1,行14
数据库中已存在名为"#test"的对象.
ifs内部(create table DDL之前或之后)的drop table的组合似乎不满足sql检查器.
我有什么想法可以做到这一点?例如,我可以告诉SQL不执行语法检查并按原样接受sproc吗?
如果同时从不同客户端发生多个请求,则Hub.Context.ConnectionId的值在执行处理程序期间发生更改.
假设我有2个客户端与客户端ID A和B连接,我的Hub上有一个名为foo()的方法.我从A向服务器发送请求调用foo(),然后在处理来自A的请求时,我从B调用foo()发送请求.在处理A的请求开始时Hub.Context.ConnectionId == A但在方法结束时调用Hub.Context.ConnectionId == B.
我应该复制Hub.Context吗?我应该在什么时候这样做?
我在MS Sql Server 2008 R2中有一个简单的队列实现.这是队列的本质:
CREATE TABLE ToBeProcessed
(
Id BIGINT IDENTITY(1,1) PRIMARY KEY NOT NULL,
[Priority] INT DEFAULT(100) NOT NULL,
IsBeingProcessed BIT default (0) NOT NULL,
SomeData nvarchar(MAX) NOT null
)
Run Code Online (Sandbox Code Playgroud)
我想原子地选择按优先级排序的前n行和IsBeingProcessed为false的id,并更新这些行以表示它们正在被处理.我以为我会使用Update,Top,Output和Order By的组合,但不幸的是你不能在Update语句中使用top和order by.
所以我创建了一个in子句来限制更新,并且子查询按顺序执行(见下文).我的问题是,这整个语句是原子的,还是我需要将它包装在一个事务中?
DECLARE @numberToProcess INT = 2
CREATE TABLE #IdsToProcess
(
Id BIGINT NOT null
)
UPDATE
ToBeProcessed
SET
ToBeProcessed.IsBeingProcessed = 1
OUTPUT
INSERTED.Id
INTO
#IdsToProcess
WHERE
ToBeProcessed.Id IN
(
SELECT TOP(@numberToProcess)
ToBeProcessed.Id
FROM
ToBeProcessed
WHERE
ToBeProcessed.IsBeingProcessed = 0
ORDER BY
ToBeProcessed.Id,
ToBeProcessed.Priority DESC)
SELECT
* …Run Code Online (Sandbox Code Playgroud) 这里有一个类似的问题在Memory OleDbConnection到Excel文件中,但这个问题是通过另一种方式完全避免它来回答的.
下面是一些使用OleDbConnection从磁盘访问Excel文件的示例代码:
static void Main(string[] args)
{
String filePathToExcelFile = "c:\\excelfile.xls";
Boolean hasHeaders = true;
String connectionString = String.Format(
"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};" +
"Extended Properties=\"Excel 12.0;HDR={1};IMEX=2\"",
filePathToExcelFile, hasHeaders ? "Yes" : "No");
using(OleDbConnection conn = new OleDbConnection(connectionString))
using (OleDbCommand command = new OleDbCommand("SELECT * FROM [Sheet1$]",
conn))
{
conn.Open();
OleDbDataReader datareader = command.ExecuteReader();
while(datareader.Read())
{
Object[] values = new object[datareader.FieldCount];
datareader.GetValues(values);
Console.WriteLine(String.Join(",", values));
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想从System.IO.Stream磁盘上的非查找文件而不是永久文件中提取Excel文件.
问题分为两部分,a)我可以将OleDbConnection"指向"System.IO.Stream吗?b)如果可以,那么只能是前向流而不是可寻找流?
仅供参考:如果要运行此代码段,则需要安装Microsoft Access数据库引擎2010可再发行组件.如果你安装64位,你需要将项目定位为x64,反之亦然.
我正在尝试使用API在给定时间发布值(值和时间元组).这些样本将由数据查看器(例如图表)使用.
我想将值与数量和单位相关联,例如以米为单位的长度.这样我的"观众"可以适当地缩放它.
我正在寻找一种分层枚举,如下所示:
enum Quantity
{
Mass.Kg,
Mass.g,
Length.m,
Length.mm
}
Run Code Online (Sandbox Code Playgroud)
但这在C#中不存在.
我不确定表达这个的最佳模式,我想出了以下内容.是否有一种公认的或更好的方法来做到这一点?
using System;
using Moq;
namespace ConsoleApplication26
{
class Program
{
static void Main(string[] args)
{
//use a Mock to play with the API
Mock<ITelemetryPublisherFactory> mockTelemetryPublisherFactory = new Mock<ITelemetryPublisherFactory>();
var telemetryPublisherFactory = mockTelemetryPublisherFactory.Object;
//example usages
var massTelemetryPublisher = telemetryPublisherFactory.GetChannelSamplePublisher<Double>("My Mass", Mass.Kg);
massTelemetryPublisher.PublishChannelSampleAtTimeNow(83.4);
var lengthTelemetryPublisher = telemetryPublisherFactory.GetChannelSamplePublisher<Int32>("My Height", Length.?m);
lengthTelemetryPublisher.PublishChannelSampleAtTimeNow(1800000);
//10 years time..
lengthTelemetryPublisher.PublishChannelSampleAtTimeNow(1800000);
massTelemetryPublisher.PublishChannelSampleAtTimeNow(120.1);
}
}
public interface ITelemetryPublisherFactory
{
ITelemetryPublisher<T> GetChannelSamplePublisher<T>(String channelName, Quantity quantity);
}
public interface …Run Code Online (Sandbox Code Playgroud) 使用Nancy我可以返回这样的响应:
public class MainModule : NancyModule
{
public MainModule()
{
Get["/"] = parameters => {
return "Hello World";
};
}
}
Run Code Online (Sandbox Code Playgroud)
我可以像这样返回状态400:
public class MainModule : NancyModule
{
public MainModule()
{
Get["/"] = parameters => {
return HttpStatusCode.BadRequest;
};
}
}
Run Code Online (Sandbox Code Playgroud)
如何返回特定的http状态代码并设置响应文本?