2013-05-13 131 views
0

我一直在旋转我的车轮几天现在没有取得任何进展,我迄今为止在网上发现的建议还没有完全实现,所以在这里:Visual Studio 2012 + 403.7错误

  1. 我有一个WCF服务,它连接到...不知道什么类型的Web服务,你会在另一端调用这种类型的REST-ISH。该方法的URL如下所示:“https://partner.someservice.com/SomeMethod.asp”。我将一些查询字符串参数塞入到结尾,并将请求发送到它们的服务器。

  2. VS中的错误只显示403,但是当我使用Fiddler时,我看到了403.7。在将证书导入浏览器之前,我也看到了403.7。我可以检查我的请求对象,并看到指定了[1] cert的ClientCertificates,所以我很确定它已被连接。

  3. 我已将.pfx文件导入我的机器和本地用户证书商店。我以许多方式多次运行winhttpcertcfg实用程序,基本上遵循了我在MSDN和SO帖子中看到的说明。

    winhttpcertcfg -g -c LOCAL_MACHINE \ MY -s [证书] -a [用户/ ASPNET/auth'd用户]

    winhttpcertcfg.exe -i [cert.pfx] -c LOCAL_MACHINE \ MY -p [pwd]

  4. 我已将.pfx文件导入Chrome。如果我在Chrome中打开该网址,我会提示选择我的证书,然后我可以继续访问该网址。在IE中有相同的行为。

所以这似乎是专门针对我在VS运行,虽然我不知道我没有检查什么选项,或者什么允许,我还没有批准。在我的WCF服务的项目属性下,我尝试了“使用Visual Studio开发服务器”和“使用本地IIS Web服务器”,但是从每个服务器获得相同的行为。我错过了什么?

一些代码:

private static string DoPost(string postData) 
    { 
     string result = null; 

     var httpWebRequest = (HttpWebRequest)WebRequest.Create(GetEndpoint()); 
     var encoding = new ASCIIEncoding(); 
     var bytes = encoding.GetBytes(postData); 

     httpWebRequest.Method = "POST"; 
     httpWebRequest.ContentType = "application/x-www-form-urlencoded"; 
     httpWebRequest.ContentLength = bytes.Length; 
     httpWebRequest.ClientCertificates.Add(clientCertificate); 

     using (var stream = httpWebRequest.GetRequestStream()) 
     { 
      stream.Write(bytes, 0, bytes.Length); 
      stream.Close(); 

      using (var httpWebResponse = httpWebRequest.GetResponse()) 
      using (var responseStream = httpWebResponse.GetResponseStream()) 
      { 
       if (responseStream != null) 
       { 
        using (var reader = new StreamReader(responseStream)) 
        { 
         result = reader.ReadToEnd(); 
        } 
       } 
      } 
     } 

     return result; 
    } 

和代码获得证书(由其他开发人员编写的实用工具类,这似乎工作在生产就好了):

public static X509Certificate2 GetCertificateBySerial(string serial) 
    { 
     var store = new X509Store(StoreName.My, StoreLocation.LocalMachine); 
     store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly); 

     var certColl = store.Certificates.Find(X509FindType.FindBySerialNumber, serial, false); 
     store.Close(); 

     if (certColl.Count == 0) 
     { 
      throw new Exception(String.Format("A certificate with a serial number of \"{0}\" is not installed on the server.", serial)); 
     } 
     return certColl[0]; 
    } 
+0

我会尝试将证书添加到受信任的根证书颁发机构存储中。我认为,只要浏览器在浏览URL时提示您输入任何内容,您的代码将无法直接连接。 – 2013-05-13 16:44:36

+0

感谢您的建议。我尝试将它导入本地计算机和当前用户可信根证书颁发机构,但都没有任何效果。 – 2013-05-13 16:50:44

+0

嗯 - 我明白了。您可能已经看到了这一点,但[本页]上的评论(http://support.microsoft.com/kb/186812)表明它实际上是服务器上的问题。 – 2013-05-13 17:08:03

回答

0

我做几个变化,并能够得到这个工作。首先,我必须从GET更改为POST *,并且这样做时我意外地在发布数据(oops)中留下了一部分端点/ URL。其次,我在HttpWebRequest的包括在此:

httpWebRequest.ProtocolVersion = HttpVersion.Version11; 

而在去年的403.7错误实际上是由小提琴手拦截引起我的流量。我没有在Fiddler中正确配置此证书,但接下来会出现。一旦我关闭了Fiddler并且正确地格式化了我的POST数据,事情就解决了。

*从GET切换到POST与解决这个问题无关,只是一些故事。

TL; DR我没有正确格式化我的请求。