2013-07-08 183 views
1

我创建了一个wcf服务并将其托管在Windows Azure上。 wcf服务是一个https服务。当我打电话给客户时,客户需要证书来验证其真实性。使用证书认证来调用HTTPS WCF服务

当我在broswer上键入服务url时,它会要求验证证书,并运行serivce。

enter image description here

到目前为止好。

现在我需要访问MVC 4应用程序中的相同服务。所以我做了一个简单的ajax调用。

<script> 
$(document).ready(function() { 
    $("#GetAdjustedSalary").click(function() { 
     var salary = parseFloat($("#salary").val()); 
     var infalation = parseFloat($("#inflation").val()); 

     $.ajax({ 
      url: "https://newtonsheikh.cloudapp.net/SalaryService.svc/adjustedsalary?a=" + salary + "&b=" + infalation, 
      type: "GET", 
      dataType: "JSON", 
      contentType: "application/json", 
      success: function (data) { 
       alert(data); 
      } 

     }); 
    }); 
}); 
</script> 

但我没有得到结果。相反,我总是得到中止错误403

enter image description here enter image description here

我是否需要写在web.config文件中的东西MVC应用?我被卡住了,真的需要帮助。

由于

回答

1

得到的溶液:

在AJAX调用我在控制器进行的呼叫到所述控制器

<script> 
$(document).ready(function() { 
    $("#GetAdjustedSalary").click(function() { 
     var salary = parseFloat($("#salary").val()); 
     var infalation = parseFloat($("#inflation").val()); 

     var object = { 
      salary: salary, 
      infalation: infalation 
     } 

     var data = JSON.stringify(object); 

     $.ajax({ 
      url: "Home/GetData/", 
      type: "POST", 
      data: data, 
      dataType: "JSON", 
      contentType: "application/json", 
      success: function (data) { 
       $("#answer").html(data); 
      } 

     }); 
    }); 
}); 

然后:

[HttpPost] 
    public ActionResult GetData(string salary, string infalation) 
    { 
     string output = ""; 

     try 
     { 
      X509Certificate Cert = X509Certificate.CreateFromCertFile("d://Cert//newton2.cer"); 

      ServicePointManager.CertificatePolicy = new CertPolicy(); 
      HttpWebRequest Request = (HttpWebRequest)WebRequest.Create("https://newtonsheikh.cloudapp.net/SalaryService.svc/adjustedsalary?a="+salary+" &b="+infalation+""); 
      Request.ClientCertificates.Add(Cert); 
      Request.UserAgent = "Client Cert Sample"; 
      Request.Method = "GET"; 
      HttpWebResponse Response = (HttpWebResponse)Request.GetResponse(); 
      Console.WriteLine("{0}" + Response.Headers); 
      Console.WriteLine(); 

      StreamReader sr = new StreamReader(Response.GetResponseStream(), Encoding.Default); 
      int count; 

      char[] ReadBuf = new char[1024]; 
      do 
      { 
       count = sr.Read(ReadBuf, 0, 1024); 
       if (0 != count) 
       { 
        output += new string(ReadBuf); 
       } 

      } while (count > 0); 

     } 
     catch (Exception ex) 
     { 
      //Throw the exception...lol :P 
     } 

     output = output.Replace("\0", ""); 

     string jsonString = JsonConvert.SerializeObject(output, Newtonsoft.Json.Formatting.None, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }); 

     return Json(jsonString, JsonRequestBehavior.AllowGet); 
    } 

CertPolicy类别:

class CertPolicy : ICertificatePolicy 
{ 
    public bool CheckValidationResult(ServicePoint srvPoint, X509Certificate certificate, WebRequest request, int certificateProblem) 
    { 
     // You can do your own certificate checking. 
     // You can obtain the error values from WinError.h. 

     // Return true so that any certificate will work with this sample. 
     return true; 
    } 
}