gpt4 book ai didi

c# - 读取 POST 请求 XML - boolean 值始终读取为 false

转载 作者:太空宇宙 更新时间:2023-11-03 13:49:17 25 4
gpt4 key购买 nike

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

<StockListRequestData xmlns="http://myWebService.com/endpoint">
<UserID>2750</UserID>
<StockDatabase>stockLeekRoadVenue</StockDatabase>
<InStockOnly>true</InStockOnly>
</StockListRequestData>

此 XML 匹配 DataContract在我的网络服务上:

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

[DataMember]
public string StockDatabase { get; set; }

[DataMember]
public bool InStockOnly { get; set; }
}

问题是 <InStockOnly>true</InStockOnly>元素,当我将其设置为 truefalse它将始终被解释为 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();
}
}

结果 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>

我希望这足以继续下去,我已经被难住了很多年,只是无法弄清楚为什么它会以这种方式运行..如果您需要我没有包含的其他代码,请随时询问.

非常感谢,

安迪

编辑:

添加一些上下文来显示正在发生的事情:

例如,我知道:

    <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>

有它的InStock行设置为 0,这意味着如果我传入 true,这不应显示在生成的 XML 中.

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

如果我传入 <InStockOnly>false</InStockOnly>它仍然显示“正确”的结果,因此在它到达反转之前将其读取为错误!

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

我还添加了 requestData.InStockOnly到 StockListResponseData DataContract 并在那里显示它输出 requestData.InStockOnly 的值作为false .

最佳答案

你的发现让我得到了解释,有人和你有类似的问题:

WCF DataContract DataMember order? http://msdn.microsoft.com/en-us/library/ms729813.aspx

Next in order are the current type’s data members that do not have the Order property of the DataMemberAttribute attribute set, in alphabetical order.

当没有明确指定数据成员的顺序时,它们的序列化顺序是按字母顺序排列的。这解释了为什么 InStockOnly 在移到顶部时起作用,因为它是按字母顺序排列的。另一方面,为什么 StockDatabase 工作有点神秘,因为它按字母顺序排在 UserId 之后(如果 StockDb 为空,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; }
}

事实上,显式指示顺序可能是一个好习惯,因此稍后添加新属性不会破坏任何内容。

关于c# - 读取 POST 请求 XML - boolean 值始终读取为 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14187461/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com