我正在尝试在C#项目中使用ServiceReference。 该项目旨在测试连接。我有一个客户试图将C#应用程序连接到我的一个同事的一个Web服务。无法建立联系,他认为这是我们自己的错误。
我正在尝试编写一个简单的C#项目。 多说故事......现在需要信息。
这是我的方法的源代码:
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
答案 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”,以便应用程序将该代理与该服务引用一起使用。