Передача сообщения с кодом ответа через класс - PullRequest
0 голосов
/ 25 октября 2018

Я использую веб-API, но я хочу иметь возможность передать сообщение с моим ответом, но я использую этот метод вне класса, как это можно сделать в следующем примере.

public HttpStatusCode CreateInvoice(string PumpName,string customerCode, double fuelQty, double price)
{
        HttpStatusCode retval = new HttpStatusCode();
        SAPbobsCOM.Documents oInvoice = company.GetBusinessObject(BoObjectTypes.oInvoices);

            oInvoice.DocDate = DateTime.Now;
            oInvoice.CardCode = customerCode;
            oInvoice.Lines.ItemCode = "DSL";
            oInvoice.Lines.Quantity = fuelQty;
            oInvoice.Lines.LineTotal = price;
            oInvoice.Lines.Add();               


            int addInvoice = oInvoice.Add();
            if (addInvoice == 0)
            {
                retval = HttpStatusCode.OK;
            }
            if (addInvoice < 0)
            {
                string errorDescription = company.GetLastErrorDescription();        
                retval = HttpStatusCode.NotModified;
            }

            return retval;           
    }

Я хочу иметь возможность передать эту строку обратно как часть ответного сообщения. Я не знаю, как это сделать в контроллере, но эта функция находится вне класса.Как там у меня нет доступа к объекту запроса?

string errorDescription = company.GetLastErrorDescription();        

Редактировать 2 Хорошо, поэтому я создал функцию с сообщением httprequest, но я не вижу результат в заголовке, который показывает мнестатус 200 в порядке для счета, созданного, но не для сообщения.

public HttpResponseMessage CreateInvoice(string PumpName,string customerCode, double fuelQty, double price,string FuelType)
{
        HttpResponseMessage retval = new HttpResponseMessage();



        SAPbobsCOM.Documents oInvoice = company.GetBusinessObject(BoObjectTypes.oInvoices);
        HttpRequestMessage Errordescription = new HttpRequestMessage() ;

            oInvoice.DocDate = DateTime.Now;
            oInvoice.CardCode = customerCode;
            oInvoice.Lines.ItemCode = FuelType;
            oInvoice.Lines.Quantity = fuelQty;
            oInvoice.Lines.LineTotal = price;
            oInvoice.Lines.Add();              


            int addInvoice = oInvoice.Add();

            if (addInvoice == 0)
            {
                retval.StatusCode = HttpStatusCode.OK;
                retval.RequestMessage=new HttpRequestMessage(HttpMethod.Post, "Invoice has been created!");

            }
            if (addInvoice < 0)
            {

                retval.StatusCode = HttpStatusCode.NotAcceptable;
                retval.RequestMessage = new HttpRequestMessage(HttpMethod.Post,string.Format("Invoice was not created {0} sap code error {1}!", company.GetLastErrorDescription(),addInvoice));
                            }

            HttpResponseMessage response = retval;
            return response;
}

Вот как я использую сообщение в моем контроллере API.

public HttpResponseMessage Post(string PumpName, string FuelTagNumber,
     double FuelQty, double FuelValue, string FuelType, string TransactionDate, string TransActionDate, string systemgroup1, string systemgroup2, string systemgroup3, string systemgroup4)
{
        HttpResponseMessage retVal = new HttpResponseMessage();

        HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, "value");

        int connect = _boneAPi.Connect();
            if (connect == 0)

            {
                string CustomerCode = _boneAPi.GetCustomerCodeByVechicleTag(FuelTagNumber);

                HttpResponseMessage _invoiceStatusCode = _boneAPi.CreateInvoice(PumpName, CustomerCode, FuelQty, FuelValue,FuelType);
            retVal = _invoiceStatusCode;

                    _boneAPi.ImportTransactionToTable("", CustomerCode, TransactionDate, TransactionDate, systemgroup1, systemgroup3, FuelTagNumber, systemgroup2, systemgroup4, FuelQty.ToString(), FuelValue.ToString(), FuelType, "1");                       
   }

            return retVal;

 }

Чтобы отобразить результат сообщения пользователя

enter image description here

Редактировать 2

Чтобы показать другим, как я это решил.

 public HttpResponseMessage CreateInvoice(string PumpName, string customerCode, double fuelQty, double price, string FuelType)
 {
    HttpResponseMessage retval = new HttpResponseMessage();
    SAPbobsCOM.Documents oInvoice = company.GetBusinessObject(BoObjectTypes.oInvoices);
    HttpRequestMessage Errordescription = new HttpRequestMessage();

    oInvoice.DocDate = DateTime.Now;
    oInvoice.CardCode = customerCode;
    oInvoice.Lines.ItemCode = FuelType;
    oInvoice.Lines.Quantity = fuelQty;
    oInvoice.Lines.LineTotal = price;
    oInvoice.Lines.Add();

    int addInvoice = oInvoice.Add();
    if (addInvoice == 0)
    {
       retval.StatusCode = HttpStatusCode.OK;
       retval.RequestMessage = new HttpRequestMessage(HttpMethod.Post, "");
       retval.Content = new StringContent("Invoice has been created!");
    }
    if (addInvoice < 0)
    {
       retval.StatusCode = HttpStatusCode.NotAcceptable;
       retval.Content = new StringContent(string.Format("Invoice was not created {0} sap code error {1}!", company.GetLastErrorDescription(), addInvoice));
     }
    HttpResponseMessage response = retval;
    return response;
}

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Я настоятельно рекомендую, чтобы функция, создающая счета, вообще не знала / не заботилась о кодах статуса http.Все, что вам нужно знать, это созданный новый счет или нет, и если нет, то почему бы и нет.Одним из вариантов является использование исключения, но если «не изменено, по причине ххх», то, что вы ожидаете, случается достаточно часто, тогда, вероятно, это не лучший путь вперед.Возможно, вам нужно что-то вроде различного объединения, но в C # нет хорошего встроенного способа достижения этого, поэтому вы можете определить тип «ответа», который может содержать либо успешный ответ, либо описание ошибки.Затем на уровне контроллера (который должен знать о кодах состояния http и т. Д.) Определите, какой ответ нужно вернуть клиенту, основываясь на содержимом объекта ответа.Если вы хотите, чтобы сам объект ответа отвечал за определение того, должно ли быть отображено сообщение об ошибке, у него может быть метод, который принимает две лямбда-выражения, вызывая либо один, если он находится в состоянии «успех», либо другой (с описанием ошибки).в качестве параметра) в состоянии сбоя.Но это возможно излишне.

0 голосов
/ 25 октября 2018

Как насчет сделать возврат кортежем

Если вы используете c # 7, это будет выглядеть так:

public (HttpStatusCode code, string description) CreateInvoice(string PumpName, string customerCode, double fuelQty, double price)
{
    HttpStatusCode retval = new HttpStatusCode();
    string errorDescription = string.Empty;

    SAPbobsCOM.Documents oInvoice = company.GetBusinessObject(BoObjectTypes.oInvoices);

    oInvoice.DocDate = DateTime.Now;
    oInvoice.CardCode = customerCode;
    oInvoice.Lines.ItemCode = "DSL";
    oInvoice.Lines.Quantity = fuelQty;
    oInvoice.Lines.LineTotal = price;
    oInvoice.Lines.Add();


    int addInvoice = oInvoice.Add();
    if (addInvoice == 0)
    {
        retval = HttpStatusCode.OK;
    }
    if (addInvoice < 0)
    {
        errorDescription = company.GetLastErrorDescription();
        retval = HttpStatusCode.NotModified;
    }

    return (code: retval, description: errorDescription);
}

Если в более старой версии вам нужно будет вернуть кортеж

...