3
votes

I am trying to create a WCF service in C# for use by a client app built using Delphi. When downloading the WSDL in Delphi, no objects are included in the file generated by Delphi.

What do I have to do in C# to declare the objects in the WSDL when imported into Delphi?

EDIT

I am using EntityFramework in C# to generate the classes from the database (it was an existing database so please don't tell me I should do code first). Here is an example of one of the class files:

namespace LeadVendorModel
{
    using System;
    using System.Collections.Generic;
    using System.Data.Entity;

    public partial class T_LeadVendorEmailDetail : DbContext
    {
        public int LeadVendorEmailDetailID { get; set; }
        public int LeadVendorEmailID { get; set; }
        public string Field_label { get; set; }
        public string Field_Data { get; set; }
        public Nullable<System.DateTime> EnteredOn { get; set; }

        public virtual T_LeadVendorEmailHeader T_LeadVendorEmailHeaders { get; set; }
    }
}

I am simply using the 'Publish' action in the C# project to publish the project. I am not sure where else I would define the types/objects that Delphi is complaining about. Is there a XML setting that I need to add to Web.config?

I am happy to give any other info needed, just not sure what else would help (first time using EF and first time creating an API).

END EDIT

Here is a snippet of the generated file (no objects created):

unit LeadService;

interface

uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns;

type

  // ************************************************************************ //
  // The following types, referred to in the WSDL document are not being represented
  // in this file. They are either aliases[@] of other types represented or were referred
  // to but never[!] declared in the document. The types from the latter category
  // typically map to predefined/known XML or Borland types; however, they could also
  // indicate incorrect WSDL documents that failed to declare or import a schema type.
  // ************************************************************************ //
  // !:GetFranchiseDetails - "http://tempuri.org/"
  // !:GetFranchiseDetailsResponse - "http://tempuri.org/"
  // !:FranchiseExists - "http://tempuri.org/"
  // !:FranchiseExistsResponse - "http://tempuri.org/"
  // !:GetLeadDetails  - "http://tempuri.org/"
  // !:GetLeadDetailsResponse - "http://tempuri.org/"
  // !:GetLookupList   - "http://tempuri.org/"
  // !:GetLookupListResponse - "http://tempuri.org/"
  // !:SubmitLead      - "http://tempuri.org/"
  // !:SubmitLeadResponse - "http://tempuri.org/"
  // !:SubmitLeadAction - "http://tempuri.org/"
  // !:SubmitLeadActionResponse - "http://tempuri.org/"
  // !:SubmitLeadOutcome - "http://tempuri.org/"
  // !:SubmitLeadOutcomeResponse - "http://tempuri.org/"


  // ************************************************************************ //
  // Namespace : http://tempuri.org/
  // binding   : wsHttpBinding
  // service   : LeadService
  // port      : wsHttpBinding
  // ************************************************************************ //
  ILeadService = interface(IInvokable)
  ['{C61A5600-2BA8-436A-41AA-F81C45A9A738}']
    function  GetFranchiseDetails(const parameters: GetFranchiseDetails): GetFranchiseDetailsResponse; stdcall;
    function  FranchiseExists(const parameters: FranchiseExists): FranchiseExistsResponse; stdcall;
    function  GetLeadDetails(const parameters: GetLeadDetails): GetLeadDetailsResponse; stdcall;
    function  GetLookupList(const parameters: GetLookupList): GetLookupListResponse; stdcall;
    function  SubmitLead(const parameters: SubmitLead): SubmitLeadResponse; stdcall;
    function  SubmitLeadAction(const parameters: SubmitLeadAction): SubmitLeadActionResponse; stdcall;
    function  SubmitLeadOutcome(const parameters: SubmitLeadOutcome): SubmitLeadOutcomeResponse; stdcall;
  end;

function GetILeadService(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): ILeadService;

Here is a snippet of another Delphi generated file which includes the object definitions:

interface

uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns;

type

  // ************************************************************************ //
  // The following types, referred to in the WSDL document are not being represented
  // in this file. They are either aliases[@] of other types represented or were referred
  // to but never[!] declared in the document. The types from the latter category
  // typically map to predefined/known XML or Borland types; however, they could also
  // indicate incorrect WSDL documents that failed to declare or import a schema type.
  // ************************************************************************ //
  // !:dateTime        - "http://www.w3.org/2001/XMLSchema"
  // !:int             - "http://www.w3.org/2001/XMLSchema"
  // !:boolean         - "http://www.w3.org/2001/XMLSchema"
  // !:decimal         - "http://www.w3.org/2001/XMLSchema"
  // !:string          - "http://www.w3.org/2001/XMLSchema"

  CompanyID            = class;                 { "http://..." }
  Address              = class;                 { "http://..." }
  Property_            = class;                 { "http://..." }
  AppointmentRequest   = class;                 { "http://..." }


  { "http://..." }
  PersonServiceRoleID = (
      BuyersAgent, 
      SellersAgent, 
      SellersLawyer, 
      BuyersLawyer, 
      Seller,
      Buyer, 
      Owner, 
      Tenant, 
      TransactionCoordinator, 
      RelocationCoordinator, 
      ReferredBy,
      ContractorAdministrator, 
      InsuranceAgent, 
      Contractor,
      PropertyManagement, 
      Buyer1,
      Seller1, 
      Owner1, 
      Tenant1
);

  { "http://..." }
  PersonSearchCriteriaActiveType = (DeletedOnly, Both, UndeletedOnly);

  ArrayOfInt = array of Integer;                { "http://..." }


  // ************************************************************************ //
  // Namespace : http://...
  // ************************************************************************ //
  CompanyID = class(TRemotable)
  private
    FServiceCompanyID: Integer;
  published
    property ServiceCompanyID: Integer read FServiceCompanyID write FServiceCompanyID;
  end;


  // ************************************************************************ //
  // Namespace : http://...
  // soapAction: http://...
  // transport : http://schemas.xmlsoap.org/soap/http
  // binding   : CompanySoap
  // service   : Company
  // port      : CompanySoap
  // URL       : http://...
  // ************************************************************************ //
  CompanySoap= interface(IInvokable)
  ['{44A8B9BE-7E75-8534-279B-46BF5D1674D7}']
    function  GetAvailableAppointments(const appointmentRequest: AppointmentRequest; const companyID: CompanyID): ArrayOfAppointmentSlot; stdcall;
    function  GetQuote(const quoteRequest: QuoteRequest; const companyID: CompanyID): ServiceFee; stdcall;
    function  GetPropertyTypes(const companyID: CompanyID): ArrayOfPropertyType; stdcall;
    function  GetFoundationTypes(const companyID: CompanyID): ArrayOfFoundationType; stdcall;
    function  GetServiceTypes(const companyID: CompanyID): ArrayOfServiceType; stdcall;
    function  GetServiceProfessionals(const companyID: CompanyID): ArrayOfInspectorDetails; stdcall;
    function  ScheduleAppointment(const appointmentslot: AppointmentSlot; const customer: Contact; const companyID: CompanyID; const Quote: QuoteRequest; const agent: ArrayOfServiceAgent): AppointmentInfo; stdcall;
    function  FindAppointment(const contactID: Integer; const companyID: CompanyID): ArrayOfAppointmentInfo; stdcall;
    procedure CancelAppointment(const companyID: CompanyID; const appointmentID: Integer); stdcall;
    function  CustomerLookUp(const criteria: PersonSearchCriteria): ArrayOfContact; stdcall;
    function  AddContact(const customer: Contact; const companyID: CompanyID): Contact; stdcall;
    function  UpdateContact(const customer: Contact; const companyID: CompanyID): Contact; stdcall;
    function  ProcessCompanyID(const serviceCompanyID: CompanyID): CompanyID; stdcall;
  end;

function GetCompanySoap(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): CompanySoap;
1
Did you read the large comment block at the top of the file about types not being created, along with the list of them? It explains why they weren't created - because of the leading !, they're never declared. The comment says that this may indicate incorrect WSDL documents that failed to declare or import a schema. Does your service declare a schema or import one from somewhere? All of the skipped classes use tempuri.org.Ken White
I saw that comment and that is why I assume there is some declaration I have to do in C# in order for these objects to be generated.BrianKE
But you posted nothing from your C# that we can see to figure out what you're missing...??? "I understand that I'm missing something, but I'm not going to show you what I have so far. Please tell me what I need to do to fix it." - is that your question?Ken White
You can use wsdl validator or xml editor that has wsdl validator built-in such as xmlspy. It comes with 30 days trial. The validator will give you errors/warnings/hints that should help you to fix the wsdl file.Hendra
@JeroenWiertPluimers, I probably should. The worst that can happen is that it's not accepted or gets a downvote or two, and I think it's the problem that Brian is having here.Ken White

1 Answers

0
votes

The large comment block at the top of the file explains about types not being created, along with the list of them. It explains why they weren't created - because of the leading !, it indicates they're never declared.

The comment says that this may indicate incorrect WSDL documents that failed to declare or import a schema. Does your service declare a schema or import one from somewhere? All of the skipped classes use tempuri.org, which would not be a valid namespace for use in your service.