簡體   English   中英

Visual Studio 2012 + 403.7錯誤

[英]Visual Studio 2012 + 403.7 Error

我已經轉動了幾天,現在沒有任何進展,到目前為止,我在網上發現的建議還沒有完全解決問題,因此,這里是:

  1. 我有一個與WCF服務相關聯的...不確定在另一端您將調用哪種類型的Web服務,即REST風格。 該方法的URL如下所示:“ https://partner.someservice.com/SomeMethod.asp ”。 我將一些查詢字符串args塞到其末尾,然后將請求發布到他們的服務器。

  2. VS中的錯誤僅顯示403,但是當我使用Fiddler時看到403.7。 在將證書導入瀏覽器之前,我還看到了403.7。 我可以檢查我的請求對象,並查看指定了[1]證書的ClientCertificates,因此,我很確定它已附加。

  3. 我已將.pfx文件導入到我的計算機和本地用戶證書存儲中。 我已經以多種方式多次運行winhttpcertcfg實用程序,基本上遵循了我在MSDN和SO帖子上看到的說明。

    winhttpcertcfg -g -c LOCAL_MACHINE \\ MY -s [cert] -a [用戶/ aspnet /授權用戶]

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

  4. 我已將.pfx文件導入Chrome。 如果我在Chrome中點擊該URL,則會提示您選擇我的證書,然后可以繼續使用該URL。 在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];
    }

我進行了一些更改,並使其能夠正常工作。 首先,我不得不從GET更改為POST *,這樣做時我不小心將部分端點/ URL留在了post數據中(哎呀)。 其次,我將其包含在我的httpWebRequest中:

httpWebRequest.ProtocolVersion = HttpVersion.Version11;

最后,403.7錯誤實際上是由Fiddler攔截我的流量引起的。 我沒有在Fiddler中正確配置此證書,但是接下來會出現。 一旦我關閉Fiddler並正確格式化了我的POST數據,事情就解決了。

*從GET切換到POST與解決此問題無關,只是一些背景故事。

TL; DR我的請求格式不正確。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM