简体   繁体   中英

SOAP Service as Service reference in .net

I have 2 SOAP Service References in my project, and it have been working nicely for a while, but today i did an "Update Service Refrence" on both my services as i had done an update to them. But now the datastructure of the methods have change alot, and i can not figure out how to change it back.

On of my methods "bookFlight" for an example take the argument BookModel.

public class BookModel
{
    /// <summary>
    /// Id
    /// </summary>
    public int Id { get; set; }
    /// <summary>
    /// Credit card informaiton
    /// </summary>
    public CreditCardInfoModel CreditCard { get; set; }
}

Before i simply had to do the following to call the SOAP methoid

mySoapClient.bookFlight(new BookModel() { ... });

But after i have updated my service do i now have to call it like the following:

mySoapClient.bookFlight(new bookFlightRequest()
{
    Body = new bookFlightRequestBody(new BookModel()
    {
        ...
    })
});

What can i do to get it back to the orginal data structue from the first example?

The soap can be found here: http://02267.dtu.sogaard.us/LameDuck.asmx

My Service Reference Settings: 在此处输入图片说明

The SOAP code if that is needed?

/// <summary>
    /// Summary description for LameDuck
    /// </summary>
    [WebService(Namespace = "http://02267.dtu.sogaard.us/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    // [System.Web.Script.Services.ScriptService]
    public class LameDuck : System.Web.Services.WebService
    {
        private Context context;
        private BankPortTypeClient bankService;
        private int groupNumber;
        private accountType account;

        public LameDuck()
        {
            context = new Context();
            bankService = new BankPortTypeClient();
            groupNumber = int.Parse(WebConfigurationManager.AppSettings["GroupNumber"]);
            account = new accountType()
            {
                number = "50208812",
                name = "LameDuck"
            };
        }

        /// <summary>
        /// Book a flight
        /// </summary>
        /// <param name="model">Booking data</param>
        /// <exception cref="FlightNotFoundException">If the flight was not found</exception>
        /// <exception cref="CreditCardValidationFailedException">Credit card validation failed</exception>
        /// <exception cref="CreditCardChargeFailedException">Charging the credit card failed</exception>
        /// <returns>True or exception</returns>
        [WebMethod]
        public bool bookFlight(BookModel model)
        {
            var flight = context.Flights.Where(x => x.Id == model.Id).FirstOrDefault();
            if (flight == null)
                throw new FlightNotFoundException(model.Id.ToString());

            if (!bankService.validateCreditCard(groupNumber, new creditCardInfoType()
                                {
                                    name = model.CreditCard.Name,
                                    number = model.CreditCard.Number,
                                    expirationDate = new expirationDateType()
                                    {
                                        year = model.CreditCard.ExpirationDate.Year,
                                        month = model.CreditCard.ExpirationDate.Month
                                    }
                                }, flight.Price))
                throw new CreditCardValidationFailedException();

            if (!bankService.chargeCreditCard(groupNumber, new creditCardInfoType()
                                {
                                    name = model.CreditCard.Name,
                                    number = model.CreditCard.Number,
                                    expirationDate = new expirationDateType()
                                    {
                                        year = model.CreditCard.ExpirationDate.Year,
                                        month = model.CreditCard.ExpirationDate.Month
                                    }
                                }, flight.Price, account))
                throw new CreditCardChargeFailedException();

            return true;
        }

        /// <summary>
        /// Search for flights
        /// </summary>
        /// <param name="model">Search data</param>
        /// <returns>List of flights, may be empty</returns>
        [WebMethod]
        public List<Flight> getFlights(SearchFlightModel model)
        {
            var select = context.Flights.Select(x => x);

            if (model.DestinationLocation != null)
                select = select.Where(x => x.Info.DestinationLocation == model.DestinationLocation);
            if (model.DepartureLocation != null)
                select = select.Where(x => x.Info.DepartureLocation == model.DepartureLocation);
            if (model.Date != null)
                select = select.Where(x => x.Info.DepartueTime.Date == model.Date.Date);

            return select.ToList();
        }

        /// <summary>
        /// Cancel a flight
        /// </summary>
        /// <param name="model">Cancel data</param>
        /// <exception cref="FlightNotFoundException">If the flight was not found</exception>
        /// <exception cref="UnableToRefundException">If unable to refund the flight to the credit card</exception>
        /// <returns>True or exception</returns>
        [WebMethod]
        public bool cancelFlight(CancelModel model)
        {
            var flight = context.Flights.Where(x => x.Id == model.Id).FirstOrDefault();
            if (flight == null)
                throw new FlightNotFoundException(model.Id.ToString());

            if (!bankService.refundCreditCard(groupNumber, new creditCardInfoType()
                                {
                                    name = model.CreditCard.Name,
                                    number = model.CreditCard.Number,
                                    expirationDate = new expirationDateType()
                                    {
                                        year = model.CreditCard.ExpirationDate.Year,
                                        month = model.CreditCard.ExpirationDate.Month
                                    }
                                }, flight.Price, account))
                throw new UnableToRefundException();

            return true;
        }

        /// <summary>
        /// Get a flight by id
        /// </summary>
        /// <param name="id">flight id</param>
        /// <exception cref="FlightNotFoundException">If the flight was not found</exception>
        /// <returns>The flight</returns>
        [WebMethod]
        public Flight getFlight(int id)
        {
            var flight = context.Flights.Where(x => x.Id == id).FirstOrDefault();
            if (flight == null)
                throw new FlightNotFoundException(id.ToString());
            return flight;
        }

        /// <summary>
        /// Reset the database
        /// 
        /// This is only to be used for testing
        /// </summary>
        [WebMethod]
        public void ResetDatabase()
        {
            // Remove all flights
            foreach (var flight in context.Flights)
                context.Flights.Remove(flight);
            context.SaveChanges();

            // Add Flights
            context.Flights.Add(new Flight()
            {
                Airline = "DTU Airlines",
                Price = 350,
                Info = new FlightInfo()
                {
                    DepartureLocation = "DTU",
                    DestinationLocation = "Spain",
                    DepartueTime = DateTime.UtcNow.AddDays(1),
                    ArrivalTime = DateTime.UtcNow.AddDays(1).AddHours(2),
                    Carrier = "Carrier 1"
                }
            });
            context.Flights.Add(new Flight()
            {
                Airline = "DTU Airlines",
                Price = 350,
                Info = new FlightInfo()
                {
                    DepartureLocation = "Spain",
                    DestinationLocation = "DTU",
                    DepartueTime = DateTime.UtcNow.AddDays(2),
                    ArrivalTime = DateTime.UtcNow.AddDays(2).AddHours(2),
                    Carrier = "Carrier 1"
                }
            });
            context.Flights.Add(new Flight()
            {
                Airline = "DTU Airlines",
                Price = 450,
                Info = new FlightInfo()
                {
                    DepartureLocation = "DTU",
                    DestinationLocation = "Italy",
                    DepartueTime = DateTime.UtcNow.AddDays(1),
                    ArrivalTime = DateTime.UtcNow.AddDays(1).AddHours(2),
                    Carrier = "Carrier 1"
                }
            });
            context.Flights.Add(new Flight()
            {
                Airline = "DTU Airlines",
                Price = 450,
                Info = new FlightInfo()
                {
                    DepartureLocation = "Italy",
                    DestinationLocation = "DTU",
                    DepartueTime = DateTime.UtcNow.AddDays(1),
                    ArrivalTime = DateTime.UtcNow.AddDays(1).AddHours(2),
                    Carrier = "Carrier 1"
                }
            });
            context.Flights.Add(new Flight()
            {
                Airline = "DTU Airlines",
                Price = 650,
                Info = new FlightInfo()
                {
                    DepartureLocation = "DTU",
                    DestinationLocation = "Turkey",
                    DepartueTime = DateTime.UtcNow.AddDays(1),
                    ArrivalTime = DateTime.UtcNow.AddDays(1).AddHours(2),
                    Carrier = "Carrier 2"
                }
            });
            context.Flights.Add(new Flight()
            {
                Airline = "DTU Airlines",
                Price = 650,
                Info = new FlightInfo()
                {
                    DepartureLocation = "Turkey",
                    DestinationLocation = "DTU",
                    DepartueTime = DateTime.UtcNow.AddDays(1),
                    ArrivalTime = DateTime.UtcNow.AddDays(1).AddHours(2),
                    Carrier = "Carrier 2"
                }
            });
            context.SaveChanges();
        }
    }

Solution setup: 在此处输入图片说明

.ASMX are legacy web services (in the Microsoft technology stack). When adding a service reference to a legacy web service via visual studio, you can click on the "Advanced" button and then the "Add Web Reference..." button in the Service Reference Settings dialog to add it.

在此处输入图片说明

在此处输入图片说明

I'm not sure why it was suddenly needed, but a couple of things off the top of my head are that under the hood the code to generate the proxies is most likely different for .ASMX than for WCF. Another option is if you changed the bindings (I believe basicHttpBinding is the only one that supports .ASMX - SOAP 1.1 - unless you use a custom binding).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM