2011-08-17 24 views
7

Tôi gặp sự cố khi gọi một yêu cầu dịch vụ web trong C#.Trước khi xác thực yêu cầu dịch vụ web trong C#

Dịch vụ và yêu cầu đang hoạt động tốt trong giao diện người dùng Soap với tùy chọn 'Authenticate Preemptively' được bật (File, Preferences, HTTP Settings). Nếu không có cài đặt này, dịch vụ sẽ trả về 'Java.Lang.NullPointerException'.

Sự cố tôi gặp phải là tôi không biết cách bật cài đặt này trong ngữ cảnh C#.

Tôi có thư viện lớp .NET 3.5 có chứa tham chiếu dịch vụ được gọi là dịch vụ cụ thể. Đây là một đoạn mã đơn giản;

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); 
} 

Cập nhật sau trả lời đầu tiên.

Lớp CatalogService.CatalogChangeClient dường như để thực hiện các abstract class WCF

System.ServiceModel.ClientBase<TChannel> 

End Cập nhật

bất cứ ai có thể giúp tôi thiết lập thuộc tính này?

+0

xin hiển thị mã hơn đặc biệt. giao diện 'CatalogService.CatalogChangeClient' thực hiện – Yahia

+0

Có vẻ như đang triển khai lớp System.ServiceModel.ClientBase từ WCF: lớp công khai một phần CatalogChangeClient: System.ServiceModel.ClientBase , Fancydress. ResourceAccess.MCSF.CatalogService.CatalogChange –

+1

Từ những gì tôi thu thập này là một vấn đề trong việc thực hiện .NET nó sẽ gửi yêu cầu và chỉ khi nó nhận được 401 từ các dịch vụ gửi lại với Credentials ... Java WebService của bạn dường như không gửi 401 - mặc dù trước tiên bạn phải xác nhận rằng thực sự là trường hợp (tức là WireShark) ... NẾU đó là trường hợp: để phá vỡ điều này, tôi nghi ngờ bạn sẽ phải sử dụng một máy khách khác (proxy) có thể bị "lừa" để gửi thông tin đăng nhập luôn luôn ... – Yahia

Trả lời

5

Bạn có thể thử và ghi đè phương thức GetWebRequest từ cuống máy khách được tạo của bạn.

Tôi đã sử dụng tính năng này một lần và giải quyết được sự cố của mình. Xem xét các mục sau: http://www.eggheadcafe.com/community/wcf/18/10056093/consuming-webservices-and-http-basic-authentication.aspx Cuộn xuống một chút.

Dưới đây là đoạn code từ liên kết:

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; 
} 
+1

Có một bài viết hay tại [.NET WebRequest.PreAuthenticate - không hoàn toàn là những gì nó nghe như] (http://www.west-wind.com/weblog/posts/2010/Feb/18/NET-WebRequestPreAuthenticate-not-quite -những gì-nó-âm thanh-như) mô tả câu trả lời của bạn và các tùy chọn khác trong nhiều chi tiết hơn. – ChrisW

+1

Tôi nghĩ rằng bạn cần thêm không gian: request.Headers ["Authorization"] = "Basic" + ... nhưng nếu không +1 –

+0

@Julia Hayward - True, lẽ ra đã có mặt ở đó. –

Các vấn đề liên quan