使用C#服务引用与代理

时间:2013-07-30 11:16:26

标签: c# web-services proxy service-reference

我正在尝试在C#项目中使用ServiceReference。 该项目旨在测试连接。我有一个客户试图将C#应用程序连接到我的一个同事的一个Web服务。无法建立联系,他认为这是我们自己的错误。

我正在尝试编写一个简单的C#项目。 多说故事......现在需要信息。

  1. 客户使用代理服务器
  2. 出于测试原因,我尝试连接到此Web服务 http://www.w3schools.com/webservices/tempconvert.asmx
  3. 我使用.Net Framework 4.0
  4. 我的项目编译成Windows窗体应用程序。
  5. 这是我的方法的源代码:

        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                //Create Client
                ServiceReference1.TempConvertSoapClient client = new ServiceReference1.TempConvertSoapClient(@"TempConvertSoap",@"http://www.w3schools.com/webservices/tempconvert.asmx");
                if (client.ClientCredentials != null)
                {
                    //Use Values which are typed in in the GUI
                    string user = tbUser.Text;
                    string password = tbPassword.Text;
                    string domain = tbDomain.Text;
    
                    //Check what information is used by the customer.
                    if (!string.IsNullOrEmpty(user) && !string.IsNullOrEmpty(password) && !string.IsNullOrEmpty(domain))
                    {
                        client.ClientCredentials.Windows.ClientCredential = new NetworkCredential(user, password, domain);
                    }
                    if (!string.IsNullOrEmpty(user) && !string.IsNullOrEmpty(password))
                    {
                        client.ClientCredentials.Windows.ClientCredential = new NetworkCredential(user, password);
                    }
                }
                //Oh nooo... no temperature typed in
                if (string.IsNullOrEmpty(tbFahrenheit.Text))
                {
                    //GOOD BYE
                    return;
                }
                //Use the webservice 
                string celsius =  client.FahrenheitToCelsius(tbFahrenheit.Text); //<-- Simple Calculation
                tbCelsius.Text = celsius;
            }
            catch(Exception ex) 
            {
                //Something 
                MessageBox.Show(ex.ToString());
            }
    
        }
    

    以下是我的问题: 如何为此服务引用或客户端设置代理? 没有用于此目的的财产或制定者。我尝试使用ClientCredentials

2 个答案:

答案 0 :(得分:7)

好的,我自己找到了答案。 希望它会帮助某人;)。

此部分创建一个绑定。以后可以在webservice中使用

    private void button2_Click(object sender, EventArgs e)
    {
        BasicHttpBinding binding = new BasicHttpBinding("TempConvertSoap");

        if (!string.IsNullOrEmpty(tbProxy.Text))
        {
            binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
            binding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.Basic;


            string proxy = string.Format("http://{0}", tbProxy.Text);
            if (!string.IsNullOrEmpty(tbPort.Text)) 
            {
               proxy = string.Format("{0}:{1}",proxy,tbPort.Text);
            }

            binding.UseDefaultWebProxy = false;
            binding.ProxyAddress = new Uri(proxy);


        }
        EndpointAddress endpoint = new EndpointAddress(@"http://www.w3schools.com/webservices/tempconvert.asmx");

这里开始我设置绑定的旧部分。

            try
        {
            //Create Client
            ServiceReference1.TempConvertSoapClient client = new ServiceReference1.TempConvertSoapClient(binding, endpoint);
            if (client.ClientCredentials != null)
            {
                //Use Values which are typed in in the GUI
                string user = tbUser.Text;
                string password = tbPassword.Text;
                string domain = tbDomain.Text;



                client.ClientCredentials.UserName.UserName = user;
                client.ClientCredentials.UserName.Password = password;
                client.ClientCredentials.Windows.ClientCredential.Domain = domain;

                //Check what information is used by the customer.
                if (!string.IsNullOrEmpty(user) && !string.IsNullOrEmpty(password) && !string.IsNullOrEmpty(domain))
                {
                    client.ClientCredentials.Windows.ClientCredential = new NetworkCredential(user, password, domain);
                }
                if (!string.IsNullOrEmpty(user) && !string.IsNullOrEmpty(password))
                {
                    client.ClientCredentials.Windows.ClientCredential = new NetworkCredential(user, password);
                }
            }
            //Oh nooo... no temperature typed in
            if (string.IsNullOrEmpty(tbFahrenheit.Text))
            {
                //GOOD BYE
                return;
            }
            //Use the webservice 

            //THIS ONE IS IMPORTANT
            System.Net.ServicePointManager.Expect100Continue = false;
            string celsius =  client.FahrenheitToCelsius(tbFahrenheit.Text); //<-- Simple Calculation
            tbCelsius.Text = celsius;
        }
        catch(Exception ex) 
        {
            //Something 
            tbCelsius.Text = ex.Message;
            MessageBox.Show(ex.ToString());
        }

    }

我使用Squid作为我的代理并使用除代理之外的防火墙。 在我成功配置后,我遇到了错误(417)期望失败。 在研究期间,我发现了一行代码,帮助我“解决”这个问题

System.Net.ServicePointManager.Expect100Continue = false;

答案 1 :(得分:2)

这是一个古老的问题,但仍然有意义。可接受的答案有效,但是我设法用另一种方法解决了这个问题。当您向项目添加服务引用时,Visual Studio会将绑定和终结点地址等添加到web.config / app.config(取决于应用程序类型)。您可以将代理配置(ip和端口)直接添加到配置文件中,这样就无需在代码方面做任何特殊的事情:

  <system.serviceModel>
    <bindings>
      <basicHttpBinding>        
        <binding name="MyServiceBinding" 
            proxyAddress="http://123.123.12.1:80" useDefaultWebProxy="false" />
      </basicHttpBinding>
    </bindings>
    <client>    
      <endpoint address="http://address.com/endpoint"
        binding="basicHttpBinding" bindingConfiguration="MyServiceBinding"
        contract="..." name="..." />
    </client>
  </system.serviceModel>

因此,将ip和端口更改为代理服务器的ip和端口,并记住使用useDefaultWebProxy =“ false”,以便应用程序将该代理与该服务引用一起使用。

引用basicHttpBinding