Amazon Entegrasyonunda FikaAmazonAPI ile Stok Güncelleme Hatası ve Manuel XML Çözümü
Amazon SP-API ile çalışan .NET projelerinde, FikaAmazonAPI paketini kullanarak stok güncelleme işlemleri gerçekleştirmek oldukça pratik. Ancak yakın zamanda StandardPrice nesnesinin serileştirilmesi sırasında aşağıdaki hatayla karşılaştım:
InvalidOperationException: Cannot serialize object of type 'FikaAmazonAPI.ConstructFeed.Messages.StandardPrice'.
Consider changing type of XmlText member 'StandardPrice.Value' from System.Decimal to string or string array.
Problem
Amazon’a gönderilecek XML içeriği FikaAmazonAPI’nin ConstructFeedService sınıfıyla oluşturulurken, içindeki decimal türünde bir alan olan StandardPrice.Value nedeniyle .NET 9 ile birlikte artık varsayılan olarak serileştirilemiyor. Bu da XML oluşturma sırasında istisna fırlatılmasına sebep oluyor.
Başlangıçta Kullandığım Kod
public async Task<string> StokAdetGuncelle(string countryCode, List<Sku> lstSku)
{
baglanAmazon(countryCode);
ConstructFeedService createDocument = new ConstructFeedService(_connAmazon.GetCurrentSellerID, "1.02");
var list = new List<InventoryMessage>();
foreach (Sku sku in lstSku)
{
list.Add(new InventoryMessage()
{
SKU = sku.SkuCode,
Quantity = sku.Quantity
});
}
createDocument.AddInventoryMessage(list);
try
{
string xml = createDocument.GetXML();
return await connAmazon.Feed.SubmitFeedAsync(xml, FeedType.POST_INVENTORY_AVAILABILITY_DATA);
}
catch (Exception ex)
{
throw new ArgumentException($"XML oluşturma hatası: {ex.Message}", ex);
}
}
Yukarıdaki kod .NET 6 ve 7’de sorunsuz çalışırken, .NET 9 ile birlikte bu XML serileştirme sorunu ortaya çıktı.
Çözüm: XML’i Manuel Oluşturmak
FikaAmazonAPI’nin XML oluşturma kısmında hata aldığım için, aynı yapıyı koruyarak XML’i manuel olarak yazmayı tercih ettim. Bu sayede paket içine müdahale etmeden işlem çözüme kavuştu.
Yeni Çözüm Kodu:
public async Task<string> StokAdetGuncelle(string countryCode, List<Sku> lstSku)
{
baglanAmazon(countryCode);
try
{
string xml = buildAmazonInventoryXML(lstSku);
return await _connAmazon.Feed.SubmitFeedAsync(xml, FeedType.POST_INVENTORY_AVAILABILITY_DATA);
}
catch (Exception ex)
{
throw new ArgumentException($"XML oluşturma hatası: {ex.Message}", ex);
}
}
Manuel XML Oluşturucu Fonksiyon:
private string buildAmazonInventoryXML(List<Sku> lstSku)
{
using (var stringWriter = new StringWriter())
{
using (var xmlWriter = XmlWriter.Create(stringWriter, new XmlWriterSettings
{
Indent = true,
Encoding = Encoding.UTF8,
OmitXmlDeclaration = false
}))
{
xmlWriter.WriteStartDocument();
xmlWriter.WriteStartElement("AmazonEnvelope");
xmlWriter.WriteAttributeString("xmlns", "xsi", null, "http://www.w3.org/2001/XMLSchema-instance");
xmlWriter.WriteAttributeString("xsi", "noNamespaceSchemaLocation", "http://www.w3.org/2001/XMLSchema-instance", "amzn-envelope.xsd");
xmlWriter.WriteStartElement("Header");
xmlWriter.WriteElementString("DocumentVersion", "1.02");
xmlWriter.WriteElementString("MerchantIdentifier", _connAmazon.GetCurrentSellerID);
xmlWriter.WriteEndElement(); // Header
xmlWriter.WriteElementString("MessageType", "Inventory");
for (int i = 0; i < lstSku.Count; i++)
{
var sku = lstSku[i];
xmlWriter.WriteStartElement("Message");
xmlWriter.WriteElementString("MessageID", (i + 1).ToString());
xmlWriter.WriteStartElement("Inventory");
xmlWriter.WriteElementString("SKU", sku.SkuCode);
xmlWriter.WriteElementString("Quantity", sku.Quantity.ToString());
xmlWriter.WriteEndElement(); // Inventory
xmlWriter.WriteEndElement(); // Message
}
xmlWriter.WriteEndElement(); // AmazonEnvelope
xmlWriter.WriteEndDocument();
}
return stringWriter.ToString();
}
}
Aynı hatayı yaşayanlar için bu şekilde manuel XML üretmek güzel bir çözüm olabilir.
Selamlar.
