1

ユーザーがWebページからWord文書を開き、MSWordアプリケーションを使用してローカルで編集できるようにする必要があります。最後に、変更されたドキュメントをサーバーに(ポストバック)保存できるはずです。

上記の要件については、ASP.NET、C#、. NET 3.5、IIS、IE6(またはそれ以降)およびMS Office 2007(すべてのワークステーションにある必要があります)を選択しました。

3つのaspxページLogin.aspx、DocList.aspx、およびSaveDoc.aspxを持つASP.NETWebアプリケーションを開発しました。

  1. Login.aspx-認証/承認。(認証タイプ:フォーム)
  2. DocList.aspx-Word文書を表示/ダウンロードします。
  3. SaveDoc.aspx-変更されたWord文書をサーバーに保存します。

また、共有ワードリボンアドインを開発しました。これは、ユーザーがアドインの[公開]ボタンをクリックして、変更したドキュメントをサーバーに保存するのに役立ちます。変更されたドキュメントのアップロードにはWebクライアントが使用されています。変更したドキュメントをサーバーに保存するには、このアドインをすべてのワークステーションにインストールする必要があります。

    string modifiedWordXml = applicationObject.ActiveDocument.WordOpenXML;

    WebClient client = new WebClient();
    string serverAddress = "http://localhost:51507/DOCMGR/SaveDoc.aspx";
    byte[] byteArray = Encoding.UTF8.GetBytes(modifiedWordXml);
    byte[] responceArray = client.UploadData(serverAddress, byteArray);
    string res = Encoding.UTF8.GetString(responceArray);
    MessageBox.Show(res,"Document Manager");

WebページにWord文書のリンクのリストが表示されています。リンクをクリックすると、Word文書がクライアントの別のMSWordアプリケーションで開きます。そこで、ユーザーはドキュメントを編集でき、アドインリボンの[Puplish]ボタンをクリックすると、変更されたドキュメントがサーバーに正常に保存されます。

認証が無効になっている場合、私の要件は満たされ、すべてが正常に機能しています。

認証を有効にした場合、アドインは認証されておらず、IEからの認証Cookieを共有できなかったため、変更されたドキュメントをサーバーにアップロードできませんでした。

要件を満たすための回避策/解決策はありますか?あなたの助けは大歓迎です。

4

1 に答える 1

3

ASPNETセッションCookieを取得するために、GetInternetCookieをPInvokeできる場合があります。

        [DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
    protected static extern bool InternetGetCookie(
        string url,
        string name,
        StringBuilder cookieData,
        ref int length);

次に、HttpWebRequestを手動で作成し、ASPNETセッションCookieを要求オブジェクトのCookieContainerに追加できます。WebClientによって作成された基になるWebRequestにCookieを追加する方法がある場合は、代わりにそれを使用できます。

お役に立てれば。

編集:

基本的に、IEのCookieキャッシュにCookieを設定するためにHttpWebRequestで使用しているコードは次のとおりです。残念ながら、ここにキャッシュ内のCookieを読み取る機能を提供するコードはありません。

基本的に、このコードを派生させ、InteretGetCookieを使用してWebサイトのドメインからのCookieを使用してCookieCollectionオブジェクトを作成します。これらを手動で解析する必要があります。次に、HttpWebRequestで、InternetGetCookieを使用してドメインから読み取ったCookieを使用し、作成したCookieContainerにそれらを渡すことができます。

public class HttpWebConnection
{
    [DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
    protected static extern bool InternetSetCookie(
        string url,
        string name,
        string cookieData);

    [DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
    protected static extern bool InternetGetCookie(
        string url,
        string name,
        StringBuilder cookieData,
        ref int length);

    public HttpWebConnection()
    {
        Cookies = new CookieContainer();
        AutoRedirect = false;
    }

    public HttpWebConnection(string baseAddress)
        : this()
    {
        BaseAddress = baseAddress;
        BaseUri = new Uri(BaseAddress);
    }

    public bool AutoRedirect { get; set; }

    public Uri BaseUri { get; private set; }

    public string BaseAddress { get; private set; }

    public CookieContainer Cookies { get; private set; }

    public virtual HttpWebResponse Send(string method, Uri uri)
    {
        return Send(method, uri, null, false);
    }

    public virtual HttpWebResponse Send(string method, Uri uri, string post, bool authenticating)
    {
        Uri absoluteUri = null;
        if (uri.IsAbsoluteUri)
        {
            absoluteUri = uri;
        }
        else
        {
            absoluteUri = new Uri(BaseUri, uri);
        }

        HttpWebRequest request = WebRequest.Create(absoluteUri) as HttpWebRequest;
        request.CookieContainer = Cookies;
        request.Method = method;
        if (method == "POST")
        {
            request.ContentType = "application/x-www-form-urlencoded";
        }

        request.AllowAutoRedirect = false;

        if (!string.IsNullOrEmpty(post))
        {
            Stream requestStream = request.GetRequestStream();
            byte[] buffer = Encoding.UTF8.GetBytes(post);
            requestStream.Write(buffer, 0, buffer.Length);
            requestStream.Close();
        }

        HttpWebResponse response = null;

        response = request.GetResponse() as HttpWebResponse;

        foreach (Cookie cookie in response.Cookies)
        {
            bool result = InternetSetCookie(BaseAddress, cookie.Name, cookie.Value);
            if (!result)
            {
                int errorNumber = Marshal.GetLastWin32Error();
            }
        }

        if (AutoRedirect && (response.StatusCode == HttpStatusCode.SeeOther
                    || response.StatusCode == HttpStatusCode.RedirectMethod
                    || response.StatusCode == HttpStatusCode.RedirectKeepVerb
                    || response.StatusCode == HttpStatusCode.Redirect
                    || response.StatusCode == HttpStatusCode.Moved
                    || response.StatusCode == HttpStatusCode.MovedPermanently))
        {
            string uriString = response.Headers[HttpResponseHeader.Location];
            Uri locationUri;
            //TODO investigate if there is a better way to detect for a relative vs. absolute uri.
            if (uriString.StartsWith("HTTP", StringComparison.OrdinalIgnoreCase))
            {
                locationUri = new Uri(uriString);
            }
            else
            {
                locationUri = new Uri(this.BaseUri, new Uri(uriString));
            }

            response = Send("GET", locationUri);
        }

        return response;
    }
}
于 2009-10-16T16:09:04.560 に答える