ChatGPT解决这个技术问题 Extra ChatGPT

c# Soap Client Issue - more than one endpoint configuration for th at contract was found

I am trying to write a simple c# console application to test the SOAP API from here: https://www.imailtest.co.uk/webservice/imail_api.asmx?wsdl (or https://www.imailtest.co.uk/webservice/imail_api.asmx to see the api methods)

So, I added this reference and tried to invoke 2 api methods (Authentiacate & ProcessPrintReadyPDF) calls on it and got this error:

Error : An endpoint configuration section for contract 'ServiceReference1.imail_ apiSoap' could not be loaded because more than one endpoint configuration for th at contract was found. Please indicate the preferred endpoint configuration sect ion by name.

Here's my C# Code:

static void Main(string[] args)
{
    // Anticipate Error
    try
    {
        // Generate SOAP Client
        ServiceReference1.imail_apiSoapClient soapClient = new ServiceReference1.imail_apiSoapClient();

        // Login
        Console.WriteLine("Authenticating");
        soapClient.Authenticate(iMailUser, iMailPass);

        // Proceed If PDF File Exists
        if (File.Exists(PDFFile))
        {
            // Upload PDF File To iMail
            Console.WriteLine("Uploading PDF File");
            soapClient.ProcessPrintReadyPDF(File.ReadAllBytes(PDFFile), "", true);

            // Test Complete
            Console.WriteLine("Done");
        }
        else
        {
            // Log Error
            Console.WriteLine("PDF File [{0}] Does Not Exists", PDFFile);
        }
    }
    catch (Exception ex)
    {
        // Log Error
        Console.WriteLine("Error : "+ ex.Message);
    }

    // End Test
    Console.WriteLine("Press any key to continue ...");
    Console.ReadKey();
}

This is how I added the service reference to my console app:

https://i.stack.imgur.com/I6aqI.png

Any ideas?

Where is the client configuration in your web.config?
@ChrisBint -There was no web.config, however there was a app.config with the following: pastebin.com/XhbK0YNk
@CodeCaster - actually, the problem is described in the next line because more than one endpoint configuration for th at contract was found

s
sudil ravindran pk

In your App.config you can see some thing like this

 <client>
      <endpoint address="https://www.imailtest.co.uk/webservice/imail_api.asmx "
        binding="basicHttpBinding" bindingConfiguration="xxxxxxxxxx"
        contract="xxxxxxxxxx" name="xxxxxxxxxxxxx" />
      <endpoint address="https://www.imailtest.co.uk/webservice/imail_api.asmx"
        binding="customBinding" bindingConfiguration="xxxxxxxxxxxxx"
        contract="xxxxxxxxxxx" name="xxxxxxxxxxxxx" />
  </client>

remove the second endpoint and now it should be like this

<client>
      <endpoint address="https://www.imailtest.co.uk/webservice/imail_api.asmx "
        binding="basicHttpBinding" bindingConfiguration="xxxxxxxxxxxxx"
        contract="xxxxxxxxxxxxxx" name="xxxxxxxxxxxxxxx" />      
  </client>

now run the code , hope your code works fine


Worked for me. But does anyone know why this step was needed? Why did Visual Studio add the extra end point?
There is no need to do that, you only need to explicitly state the name of endPointConfigurationName, Meaning ServiceReference1.svSoapClient service = new ServiceReference1.svSoapClient ("endPointConfigurationName"); instead of ServiceReference1.svSoapClient service = new ServiceReference1.svSoapClient();` the name can be one of the names in <endpoint ... name="endPointConfigurationName"> in App.config file.
I've noticed that when you delete an webservice in Visual Studio, it doesn't delete the appropriate code in the app.config file.
L
Latheesan

I believe the problem is solved via defining the contract name like so (based on my screenshot):

ServiceReference1.imail_apiSoapClient soapClient = 
new ServiceReference1.imail_apiSoapClient("imail_apiSoap");

Now, I am no longer getting an error and the api appears to be working.


In my case, I... (1) Showed all files in the solution explorer of Visual Studio (icon near the top). (2) Drilled down until I could see configuration.svcinfo. (3) Opened configuration.svcinfo and saw two endpoints listed. (4) Scrolled to the far right to get the name of the endpoint I wanted (info therein looked like the sample posted by Sudil). Since I did not want to delete an endpoint as suggested above, I just added the name of the particular endpoint I wanted to use like Latheesan did.
Note: I am just doing initial testing via a console app so the web.config would not apply/exist in my scenario - nor the app.config file, I believe.
I had duplicates because one was generated for http and the other for https, so this was the correct solution for that scenario
A
Abdul Khaliq

[Solved! just add the End point in the webservice's proxy class asp below screen shot

https://i.stack.imgur.com/XyQJM.png


It's not on the bindingConfiguration attribute, it's on the name attribute though.
L
Larry

If you want to keep both client configurations in your config file, just create an application Setting.

So your App.config file will contains this entry that will allow you to specify the endpoint you want:

<setting name="EndPoint" serializeAs="String">
    <value>imail_apiSoap</value>
</setting>

So you can use in your code :

ServiceReference1.imail_apiSoapClient soapClient =
    new ServiceReference1.imail_apiSoapClient(Properties.Settings.Default.EndPoint);

关注公众号,不定期副业成功案例分享
Follow WeChat

Success story sharing

Want to stay one step ahead of the latest teleworks?

Subscribe Now