मैं इसके साथ बहुत संघर्ष कर रहा हूं, मुझे कुछ सवाल मिले लेकिन कोई भी मेरी जरूरतों का जवाब नहीं दे सका। मैं एक बेहतर प्रश्न और कुछ चीजें जो मैंने कोशिश की पोस्ट करने का प्रयास करूंगा।

यहाँ स्थिति है: मेरे पास एक APIGateway और एक WebApp है। WebApp APIGateway को POST अनुरोध भेजता है, अब तक बहुत अच्छा है। मैं बड़ी वस्तुओं को भेजने के लिए FromBody विशेषता का उपयोग करता हूं, और यह तब तक ठीक था जब तक मैंने इंटरफेस पेश नहीं किया :))

यहाँ कुछ कोड है:

वेबएप:

public interface ICommand
{
    Guid CorrelationId { get; set; }

    Guid SocketId { get; set; }
}

public class Command : ICommand
{       
    public Command(Guid CorrelationId, Guid SocketId)
    {
        this.CorrelationId = CorrelationId;
        this.SocketId = SocketId;
    }

    public Guid CorrelationId { get; set; } = new Guid();

    public Guid SocketId { get; set; } = new Guid();
}    

public interface IDocument
{
    Guid Id { get; set; }

    ulong Number { get; set; }
}

public class Document : IDocument
{
    public Guid Id { get; set; } = new Guid();

    public ulong Number { get; set; } = 0;
}

public interface ICreateDocumentCommand : ICommand
{
    IDocument Document { get; set; }
}

public class  CreateDocumentCommand : Command, ICreateDocumentCommand
{
    public CreateDocumentCommand(IDocument Document, ICommand Command) : base(Command.CorrelationId, Command.SocketId)
    {
        this.Document = Document;
    }

    public IDocument Document { get; set; }
}

APIGateway:

[HttpPost]
public async Task<IActionResult> Create([FromBody]CreateDocumentCommand documentCommand)
{
    if (documentCommand == null)
    {
       return StatusCode(403);
    }
    return Json(documentCommand.Document.Id);
}

केस का उपयोग करें:

public class InventoryList : Document
{
    public Guid WarehouseId { get; set; } = new Guid();
}

// Example document class
////////////////////////////////////////
// Example POST Request

ICommand command = new Command(messageId, socketId);
switch (item.GetType().Name)
{
    case "InventoryList":
    command = new CreateDocumentCommand((InventoryList)item, command);
    break;
}
string result = await PostAsync($"{apiGatewayAddress}{item.GetType().BaseType.Name}/Create", command, accessToken);

मेरा पोस्ट भेजने का कार्य:

public async Task<string> PostAsync<T>(string uri, T item, string authorizationToken = null, string authorizationMethod = "Bearer")
{
    JsonSerializerSettings jsonSerializerSettings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All };

    HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Post, uri);
    requestMessage.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

    requestMessage.Content = new StringContent(JsonConvert.SerializeObject(item, typeof(T), jsonSerializerSettings), System.Text.Encoding.UTF8, "application/json");
    return await _client.SendAsync(requestMessage).Result.Content.ReadAsStringAsync();
}

जैसा कि आप देख सकते हैं कि मैंने JSON क्रमांकन सेटिंग में TypeNameHandling.All शामिल किया है, अनुरोध भेजा जाता है और APIGateway में बनाएं को कॉल किया जाता है। हालांकि पैरामीटर दस्तावेज़ कमांड न्यूल है।

मैंने इसे पढ़ा है: Asp.Net कोर पोस्ट FromBody हमेशा शून्य

यह: एएसपी.नेट कोर एमवीसी - मॉडल बाइंडिंग: विशेषता [फ्रॉमबॉडी] (बॉडीमॉडलबाइंडर) का उपयोग करके एक इंटरफ़ेस मॉडल को बांधें

यह: JSON.NET में अक्रमांकन के लिए कास्टिंग इंटरफेस< /ए>

सभी तरह के जादू के टोटके आजमाए, नए कंस्ट्रक्टर बनाए, उन्हें [JSONConstructor] से चिह्नित किया, फिर भी कोई सफलता नहीं मिली। इसके अलावा मैंने APIGateway Cerate विधि पैरामीटर प्रकार को ICreateDocumentCommand में बदलने का प्रयास किया और फिर से मुझे एक शून्य मिला। मैं कुछ मॉडल बाइंडिंग ट्रिक्स ऑनलाइन खोज रहा हूं, हालांकि मुझे FromBody के साथ बाइंडिंग के लिए कुछ भी नहीं मिला। मुझे DI सहित कुछ समाधान भी मिले लेकिन मैं एक सरल उपाय ढूंढ रहा हूं। मुझे आशा है कि हम एक खोजने में सक्षम होंगे :)

4
Kaloyan Manev 30 मई 2018, 12:29

1 उत्तर

सबसे बढ़िया उत्तर

जेएसओएन के रूप में इंटरफेस के साथ इंटरफेस या कक्षाओं को पास करना इतना आसान नहीं है। मैंने एक कस्टम JSONConverter जोड़ा और यह अब काम करता है!

1
Kaloyan Manev 31 मई 2018, 00:20