Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 读取请求后XML-布尔值始终读取为false_C#_Xml_Wcf_Boolean - Fatal编程技术网

C# 读取请求后XML-布尔值始终读取为false

C# 读取请求后XML-布尔值始终读取为false,c#,xml,wcf,boolean,C#,Xml,Wcf,Boolean,我正在开发一个托管在IIS中的WCF RESTful web服务。我目前正在处理一个相当简单的post请求,将以下XML发送到端点: <StockListRequestData xmlns="http://myWebService.com/endpoint"> <UserID>2750</UserID> <StockDatabase>stockLeekRoadVenue</StockDatabase> <InStockOnly&g

我正在开发一个托管在IIS中的WCF RESTful web服务。我目前正在处理一个相当简单的post请求,将以下XML发送到端点:

<StockListRequestData xmlns="http://myWebService.com/endpoint">
<UserID>2750</UserID>
<StockDatabase>stockLeekRoadVenue</StockDatabase>
<InStockOnly>true</InStockOnly>
</StockListRequestData>
问题在于
true
元素,当我将其设置为
true
false
时,它将始终被解释为
false

以下是处理请求的代码:

public StockListResponseData GetListOfProducts(StockListRequestData requestData)
    {
        var stockList = new StockList(requestData.InStockOnly, requestData.StockDatabase);
        StockListResponseData response;
        if (stockList.Any())
        {
            var stockArray = new Stock[stockList.Count];
            var i = 0;
            foreach (var s in stockList)
            {
                stockArray[i] = s;
                i++;
            }
            response = new StockListResponseData
                           {
                               StockList = stockArray,
                               WasSuccessful = true,
                           };
            return response;
        }
        response = new StockListResponseData
                       {
                           WasSuccessful = false
                       };
        return response;
    }
StockList
类:

[DataContract]
public class StockList : List<Stock>
{
    public StockList(bool inStockOnly, string stockDb)
    {
        if (inStockOnly)
        {
            // Get only products that are in stock
            var conn = AndyServerDatabase.ConnectToStockMovementByDb(stockDb);
            conn.Open();
            // Compile SQL query
            var q = new SqlCommand(null, conn) { CommandText = "SELECT StockID, Name, PerBox FROM Stock WHERE InStock = 1;" };

            // Execute query
            var rdr = q.ExecuteReader();

            // Check that the output isn't null
            if (rdr.HasRows)
            {
                while(rdr.Read())
                {
                    var id = Convert.ToInt32(rdr[0]);
                    var name = rdr[1].ToString();
                    var perBox = Convert.ToInt32(rdr[2]);
                    Add(new Stock(id, name, perBox));
                }
                conn.Close();
            }
            // Output is null
            conn.Close();
        }
        else
        {
            // Get all products
            // Get only products that are in stock
            var conn = AndyServerDatabase.ConnectToStockMovementByDb(stockDb);
            conn.Open();
            // Compile SQL query
            var q = new SqlCommand(null, conn) { CommandText = "SELECT StockID, Name, PerBox FROM Stock;" };
            q.Prepare();

            // Execute query
            var rdr = q.ExecuteReader();

            // Check that the output isn't null
            if (rdr.HasRows)
            {
                while (rdr.Read())
                {
                    var id = Convert.ToInt32(rdr[0]);
                    var name = rdr[1].ToString();
                    var perBox = Convert.ToInt32(rdr[2]);
                    Add(new Stock(id, name, perBox));
                }
                conn.Close();
            }
            // Output is null
            conn.Close();
        }
        // Add();
    }
}
[DataContract]
公共类库存清单:清单
{
公开股票列表(仅限bool inStockOnly、string stockDb)
{
如果(仅限inStockOnly)
{
//只购买有库存的产品
var conn=AndyServerDatabase.ConnectToStockMovementByDb(stockDb);
conn.Open();
//编译SQL查询
var q=new-SqlCommand(null,conn){CommandText=“从InStock=1的股票中选择StockID、Name、PerBox;”;
//执行查询
var rdr=q.ExecuteReader();
//检查输出是否为空
if(rdr.HasRows)
{
while(rdr.Read())
{
var id=Convert.ToInt32(rdr[0]);
var name=rdr[1].ToString();
var perBox=Convert.ToInt32(rdr[2]);
添加(新库存(id、名称、包装箱));
}
康涅狄格州关闭();
}
//输出为空
康涅狄格州关闭();
}
其他的
{
//获取所有产品
//只购买有库存的产品
var conn=AndyServerDatabase.ConnectToStockMovementByDb(stockDb);
conn.Open();
//编译SQL查询
var q=new-SqlCommand(null,conn){CommandText=“选择StockID,Name,PerBox FROM Stock;”“};
q、 准备();
//执行查询
var rdr=q.ExecuteReader();
//检查输出是否为空
if(rdr.HasRows)
{
while(rdr.Read())
{
var id=Convert.ToInt32(rdr[0]);
var name=rdr[1].ToString();
var perBox=Convert.ToInt32(rdr[2]);
添加(新库存(id、名称、包装箱));
}
康涅狄格州关闭();
}
//输出为空
康涅狄格州关闭();
}
//添加();
}
}
结果XML:

<StockListResponseData xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <StockList xmlns:a="http://schemas.datacontract.org/2004/07/SMS">
        <a:Stock>
            <a:Id>1</a:Id>
            <a:Name>Smirnoff Vodka (70cl)</a:Name>
            <a:PerBox>6</a:PerBox>
            <a:Quantity>0</a:Quantity>
            <a:Remains>0</a:Remains>
        </a:Stock>
        <a:Stock>
            <a:Id>2</a:Id>
            <a:Name>Jagermeister (70cl)</a:Name>
            <a:PerBox>6</a:PerBox>
            <a:Quantity>0</a:Quantity>
            <a:Remains>0</a:Remains>
        </a:Stock>
    </StockList>
    <WasSuccessful>true</WasSuccessful>

1.
斯米尔诺夫伏特加(70毫升)
6.
0
0
2.
杰格迈斯特(70cl)
6.
0
0
真的

我希望这足够继续下去,我已经被难住了很久,只是不明白为什么它会这样。。如果你需要额外的代码,我还没有包括请随时问

非常感谢,

安迪

编辑:

要添加一些上下文以显示正在发生的情况,请执行以下操作:

例如,我知道:

    <a:Stock>
        <a:Id>2</a:Id>
        <a:Name>Jagermeister (70cl)</a:Name>
        <a:PerBox>6</a:PerBox>
        <a:Quantity>0</a:Quantity>
        <a:Remains>0</a:Remains>
    </a:Stock>

2.
杰格迈斯特(70cl)
6.
0
0
将其
InStock
行设置为0,这意味着如果传入
true
,则不应在结果XML中显示该行

我已经将StockList构造函数
if(inStockOnly)
更改为
if(!inStockOnly)
-然后我传入
true
-当它到达StockList构造函数时,它会被反转并显示正确的数据-因此当它到达该
if
语句时,它必须将其读取为false

如果我传入
false
它仍然显示“正确”的结果,因此它将作为false读取,直到它到达反转

同样,如果我将其保留为
if(inStockOnly)
并传入
false
,它将显示
false
的数据


我还将
requestData.InStockOnly
添加到StockListResponseData数据契约中,并在那里显示它输出
requestData的值。InStockOnly
作为
false
您的发现让我得到了解释,而与您有类似问题的人:

下一个顺序是当前类型的数据成员,它们没有DataMemberAttribute属性集的order属性,按字母顺序排列

如果未明确指定数据成员的顺序,则其序列化顺序为字母顺序。这就解释了为什么InStock只在移到顶部时才起作用,因为它是按字母顺序排列的第一个。另一方面,StockDatabase工作的原因有点神秘,因为它按字母顺序排在用户ID之后(如果StockDb为null,AndyServerDatabase.ConnectToStockMovementByDb()是否使用默认值?)

出于论证的目的,如果出于任何原因,你想保持你在那里的秩序,你可以这样做:

[DataContract(Namespace = "http://myWebService.com/endpoint")]
public class StockListRequestData
{
    [DataMember(Order = 0)]
    public string UserID { get; set; }

    [DataMember(Order = 1)]
    public string StockDatabase { get; set; }

    [DataMember(Order = 2)]
    public bool InStockOnly { get; set; }
}

事实上,明确指出顺序可能是一种好的做法,因此以后添加新属性不会破坏任何东西。

我尝试了上面的建议,但仍然不起作用!不断搜索并找到另一个解决方案,实际将“Specified”属性设置为true:

PackageImagesPayload payload = new PackageImagesPayload();
payload.UsesSplitBy = usesSplitBy;
payload.UsesSplitBySpecified = true;

您的代码看起来没问题,只是没有填充数量和剩余量,所以它们始终为0。你确定被退回的物品实际上没有存货吗?顺便说一句,您用来填充stockArray的代码不是必需的。您应该只使用Stock[]stockArray=stockList.ToArray();是的,我想这可能会引起一些混乱,
trues的目的是什么?那么你是如何验证InStockOnly实际上总是假的?你的帖子没有提到这个细节,也没有提供任何东西来证明它总是错误的。我会用更多细节来更新这个问题。修复了它!我将
的数据类型更改为
字符串
,还将
if(inStockOnly)
更改为
if(inStockOnly.Equal)
PackageImagesPayload payload = new PackageImagesPayload();
payload.UsesSplitBy = usesSplitBy;
payload.UsesSplitBySpecified = true;