我在使用C#调用Web服务请求时遇到问题。
服务和请求在Soap UI中正常工作,启用了“Authenticate Preemptively”选项(文件,首选项,HTTP设置)。如果未启用此设置,则服务将返回“Java.Lang.NullPointerException”。
我遇到的问题是我不知道如何在C#上下文中启用此设置。
我有一个.NET 3.5类库,它包含对特定服务的所谓服务引用。这是一个简单的代码段;
try
{
CatalogService.CatalogChangeClient service = new CatalogService.CatalogChangeClient();
service.ClientCredentials.UserName.UserName = "fancydress";
service.ClientCredentials.UserName.Password = "47fda9cb4b51a9e";
service.ClientCredentials.SupportInteractive = true;
ProductUpdate[] products = new ProductUpdate[1];
products[0] = new ProductUpdate();
products[0].ProductCode = "00001";
products[0].ProductDescription = "TestProduct";
string result = service.UpdateProducts(products);
}
catch (Exception exception)
{
Console.WriteLine(exception.Message);
}
第一次回复后更新。
CatalogService.CatalogChangeClient类似乎实现了WCF抽象类
System.ServiceModel.ClientBase<TChannel>
结束更新
有人可以帮我设置这个属性吗?
答案 0 :(得分:6)
您可以尝试从生成的客户端存根中覆盖GetWebRequest
方法。我曾经使用过这个,这解决了我的问题。
请查看以下网址:
向下滚动。
以下是链接中的代码:
protected override System.Net.WebRequest GetWebRequest(Uri uri)
{
HttpWebRequest request;
request = (HttpWebRequest)base.GetWebRequest(uri);
if (PreAuthenticate)
{
NetworkCredential networkCredentials =
Credentials.GetCredential(uri, "Basic");
if (networkCredentials != null)
{
byte[] credentialBuffer = new UTF8Encoding().GetBytes(
networkCredentials.UserName + ":" +
networkCredentials.Password);
request.Headers["Authorization"] =
"Basic " + Convert.ToBase64String(credentialBuffer);
}
else
{
throw new ApplicationException("No network credentials");
}
}
return request;
}