2013-12-10 78 views
0

我想这个代码在C#中验证到Web服务PHP:在PHP Web服务与C#基本身份验证

// Create the binding. 
WSHttpBinding myBinding = new WSHttpBinding(); 
myBinding.Security.Mode = SecurityMode.None; 
myBinding.Security.Transport.ClientCredentialType = 
HttpClientCredentialType.Basic; 

myBinding.Name = "Remessa"; 

myBinding.Namespace = "cramg.cra21.com.br"; 
myBinding.AllowCookies = true; 

EndpointAddress ea = new 
EndpointAddress("http://cramg.cra21.com.br/cramg/xml/protestos.php"); 

CRAMG.servercraPortTypeClient t = 
          new CRAMG.servercraPortTypeClient(myBinding, ea); 

t.ClientCredentials.UserName.UserName = "cromg"; 
t.ClientCredentials.UserName.Password = " 
t.Open(); 
t.Remessa("tfasd", "fasfa"); 

我得到错误500 而与此代码:

br.com.cra21.cramg.servercra a = new br.com.cra21.cramg.servercra(); 
System.Net.CredentialCache myCredentials = new System.Net.CredentialCache(); 
a.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1)"; 
NetworkCredential netCred = new NetworkCredential("cromg", "1234"); 
myCredentials.Add(new Uri(a.Url), "Basic", netCred); 
a.Credentials = myCredentials; 
a.UseDefaultCredentials = false; 
string retorno = a.Homologadas("2"); 

我收到此错误:身份验证失败。谁能帮忙?

+0

500错误是一个内部服务器错误。也许你通过的参数中有一个不正确,或者你缺少一些必需的参数 –

回答

0

我发现这里的溶液: http://social.msdn.microsoft.com/Forums/en-US/51ee408b-2b77-49e2-8066-308e1ca48240/problems-with-basic-http-authentication-over-soap-webservice

使用认证时,HTTP请求将不会与服务器的初始通信期间包含认证。它期望服务器生成一个401错误,此时它将发送身份验证。

所以会发生什么是服务器不需要身份验证,只有运行它的web服务。 webservice不会返回401错误,而是返回一个错误,即无法通过匿名用户访问API。即使使用preauthenticate也不能解决问题或使用凭据缓存。

覆盖的GetWebRequest方法并插入一个认证头插入到HTTP头。命名空间和类必须匹配您试图为其生成标头的名称空间和类。

在C#:

public class serverBasicAuthentication : br.com.cra21.cramg.servercra 
    { 
     protected override WebRequest GetWebRequest(Uri uri) 
     { 
      HttpWebRequest request = (HttpWebRequest) base.GetWebRequest(uri); 
      if (PreAuthenticate) 
      { 
       NetworkCredential networkcredential = base.Credentials.GetCredential(uri,"Basic"); 
       if (networkcredential != null) 
       { 
        Byte[] credentialBuffer = new UTF8Encoding().GetBytes(networkcredential.UserName + ":" + networkcredential.Password); 
        request.Headers["Authorization"] = "Basic " + Convert.ToBase64String(credentialBuffer); 
       } 
       else 
        throw new ApplicationException("No network credentials") ; 
      } 
      return request; 
     } 
    } 
0

添加服务引用到你的项目,你必须做的唯一事情是这样的:

var client = new ServiceReference1.servercraPortTypeClient(); 
    client.ClientCredentials.UserName.UserName = "name"; 
    client.ClientCredentials.UserName.Password = "password"; 

    client.Homologadas("2"); 

    client.Close(); 

注:绑定应该是basicHttpBinding的。

生成的配置:

<configuration> 
    <system.serviceModel> 
     <bindings> 
      <basicHttpBinding> 
       <binding name="server.craBinding" /> 
      </basicHttpBinding> 
     </bindings> 
     <client> 
      <endpoint address="http://cramg.cra21.com.br/cramg/xml/protestos.php" 
       binding="basicHttpBinding" bindingConfiguration="server.craBinding" 
       contract="ServiceReference1.servercraPortType" name="server.craPort" /> 
     </client> 
    </system.serviceModel> 
</configuration> 
+0

有2次“client.ClientCredentials.UserName.UserName =”,其次应该是类似密码的东西,我认为? –

+0

@Zidad,是的,谢谢! –

+0

当我复制代码时只是一个错误。 – Paulo