C# 我可以只使用Office Web Apps服务器吗
我正在尝试用office浏览器创建一个文档管理系统。我已找到此解决方案,但它使用office的客户端副本C# 我可以只使用Office Web Apps服务器吗,c#,.net,sharepoint,ms-office,ms-wopi,C#,.net,Sharepoint,Ms Office,Ms Wopi,我正在尝试用office浏览器创建一个文档管理系统。我已找到此解决方案,但它使用office的客户端副本 我想使用Office Web应用程序,但我的问题是。。。我是否需要通过SharePoint或其他Microsoft产品使用它,或者我是否可以连接一个网站,在浏览器中为我自己的文档系统使用Office Web Apps您可以编写自己的服务器,实现WOPI协议,这将在查看/编辑模式下支持PPTX/XSLX,仅在查看模式下支持DOCX/PDF。WOPI服务器的实现非常简单 要编辑word文档,您需
我想使用Office Web应用程序,但我的问题是。。。我是否需要通过SharePoint或其他Microsoft产品使用它,或者我是否可以连接一个网站,在浏览器中为我自己的文档系统使用Office Web Apps您可以编写自己的服务器,实现WOPI协议,这将在查看/编辑模式下支持PPTX/XSLX,仅在查看模式下支持DOCX/PDF。WOPI服务器的实现非常简单 要编辑word文档,您需要实现Cobalt或FSSHTTP/FSSHTTPB协议 另外,别忘了授权,Office Web Apps要求所有用户都拥有有效的Office许可证 下面是一个.NET WOPI服务器示例: 称之为: 比如: 这将在您的c:\temp中打开1.pptx
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.Runtime.Serialization;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using System.Web;
using System.IO;
using System.Runtime.Serialization.Json;
namespace WopiServerTutorial
{
public class WopiServer
{
private HttpListener Listener;
static void Main(string[] args)
{
WopiServer s = new WopiServer();
s.Start();
Console.WriteLine("A simple wopi webserver. Press a key to quit.");
Console.ReadKey();
s.Stop();
}
public void Start()
{
Listener = new HttpListener();
Listener.Prefixes.Add(@"http://+:8080/");
Listener.Start();
Listener.BeginGetContext(ProcessRequest, Listener);
Console.WriteLine(@"WopiServer Started");
}
public void Stop()
{
Listener.Stop();
}
private void ProcessRequest(IAsyncResult result)
{
HttpListener listener = (HttpListener)result.AsyncState;
HttpListenerContext context = listener.EndGetContext(result);
Console.WriteLine(@"Got a " + context.Request.HttpMethod + " request for URL: " + context.Request.Url.PathAndQuery);
var stringarr = context.Request.Url.AbsolutePath.Split('/');
var rootDir = @"C:\\temp\\";
if (stringarr.Length == 5 && context.Request.HttpMethod.Equals(@"GET"))
{
Console.WriteLine(@"Getting content for the file: " + rootDir + stringarr[3]);
// get file's content
var file = rootDir + stringarr[3];
var stream = new FileStream(file, FileMode.Open);
var fi = new FileInfo(file);
context.Response.ContentType = @"application/octet-stream";
context.Response.ContentLength64 = fi.Length;
stream.CopyTo(context.Response.OutputStream);
context.Response.Close();
}
//else if (stringarr.Length == 5 && context.Request.HttpMethod.Equals(@"POST"))
//{
// // write
//}
else if (stringarr.Length == 4 && context.Request.HttpMethod.Equals(@"GET"))
{
Console.WriteLine(@"Getting metdata for the file: " + rootDir + stringarr[3]);
var fi = new FileInfo(rootDir + stringarr[3]);
CheckFileInfo cfi = new CheckFileInfo();
cfi.AllowExternalMarketplace = false;
cfi.BaseFileName = fi.Name;
cfi.BreadcrumbBrandName = "";
cfi.BreadcrumbBrandUrl = "";
cfi.BreadcrumbDocName = "";
cfi.BreadcrumbDocUrl = "";
cfi.BreadcrumbFolderName = "";
cfi.BreadcrumbFolderUrl = "";
cfi.ClientUrl = "";
cfi.CloseButtonClosesWindow = false;
cfi.CloseUrl = "";
cfi.DisableBrowserCachingOfUserContent = true;
cfi.DisablePrint = true;
cfi.DisableTranslation = true;
cfi.DownloadUrl = "";
cfi.FileUrl = "";
cfi.FileSharingUrl = "";
cfi.HostAuthenticationId = "s-1-5-21-3430578067-4192788304-1690859819-21774";
cfi.HostEditUrl = "";
cfi.HostEmbeddedEditUrl = "";
cfi.HostEmbeddedViewUrl = "";
cfi.HostName = @"SharePoint";
cfi.HostNotes = @"HostBIEnabled";
cfi.HostRestUrl = "";
cfi.HostViewUrl = "";
cfi.IrmPolicyDescription = "";
cfi.IrmPolicyTitle = "";
cfi.OwnerId = @"4257508bfe174aa28b461536d8b6b648";
cfi.PresenceProvider = "AD";
cfi.PresenceUserId = @"S-1-5-21-3430578067-4192788304-1690859819-21774";
cfi.PrivacyUrl = "";
cfi.ProtectInClient = false;
cfi.ReadOnly = false;
cfi.RestrictedWebViewOnly = false;
cfi.SHA256 = "";
cfi.SignoutUrl = "";
cfi.Size = fi.Length;
cfi.SupportsCoauth = false;
cfi.SupportsCobalt = false;
cfi.SupportsFolders = false;
cfi.SupportsLocks = true;
cfi.SupportsScenarioLinks = false;
cfi.SupportsSecureStore = false;
cfi.SupportsUpdate = true;
cfi.TenantId = @"33b62539-8c5e-423c-aa3e-cc2a9fd796f2";
cfi.TermsOfUseUrl = "";
cfi.TimeZone = @"+0300#0000-11-00-01T02:00:00:0000#+0000#0000-03-00-02T02:00:00:0000#-0060";
cfi.UserCanAttend = false;
cfi.UserCanNotWriteRelative = false;
cfi.UserCanPresent = false;
cfi.UserCanWrite = true;
cfi.UserFriendlyName = "";
cfi.UserId = "";
cfi.Version = @"%22%7B59CCD75F%2D0687%2D4F86%2DBBCF%2D059126640640%7D%2C1%22";
cfi.WebEditingDisabled = false;
// encode json
var memoryStream = new MemoryStream();
var json = new DataContractJsonSerializer(typeof(CheckFileInfo));
json.WriteObject(memoryStream, cfi);
memoryStream.Flush();
memoryStream.Position = 0;
StreamReader streamReader = new StreamReader(memoryStream);
var jsonResponse = Encoding.UTF8.GetBytes(streamReader.ReadToEnd());
context.Response.ContentType = @"application/json";
context.Response.ContentLength64 = jsonResponse.Length;
context.Response.OutputStream.Write(jsonResponse, 0, jsonResponse.Length);
context.Response.Close();
}
else
{
byte[] buffer = Encoding.UTF8.GetBytes("");
context.Response.ContentLength64 = buffer.Length;
context.Response.ContentType = @"application/json";
context.Response.OutputStream.Write(buffer, 0, buffer.Length);
context.Response.OutputStream.Close();
}
Listener.BeginGetContext(ProcessRequest, Listener);
}
}
[DataContract]
public class CheckFileInfo
{
[DataMember]
public bool AllowExternalMarketplace { get; set; }
[DataMember]
public string BaseFileName { get; set; }
[DataMember]
public string BreadcrumbBrandName { get; set; }
[DataMember]
public string BreadcrumbBrandUrl { get; set; }
[DataMember]
public string BreadcrumbDocName { get; set; }
[DataMember]
public string BreadcrumbDocUrl { get; set; }
[DataMember]
public string BreadcrumbFolderName { get; set; }
[DataMember]
public string BreadcrumbFolderUrl { get; set; }
[DataMember]
public string ClientUrl { get; set; }
[DataMember]
public bool CloseButtonClosesWindow { get; set; }
[DataMember]
public string CloseUrl { get; set; }
[DataMember]
public bool DisableBrowserCachingOfUserContent { get; set; }
[DataMember]
public bool DisablePrint { get; set; }
[DataMember]
public bool DisableTranslation { get; set; }
[DataMember]
public string DownloadUrl { get; set; }
[DataMember]
public string FileSharingUrl { get; set; }
[DataMember]
public string FileUrl { get; set; }
[DataMember]
public string HostAuthenticationId { get; set; }
[DataMember]
public string HostEditUrl { get; set; }
[DataMember]
public string HostEmbeddedEditUrl { get; set; }
[DataMember]
public string HostEmbeddedViewUrl { get; set; }
[DataMember]
public string HostName { get; set; }
[DataMember]
public string HostNotes { get; set; }
[DataMember]
public string HostRestUrl { get; set; }
[DataMember]
public string HostViewUrl { get; set; }
[DataMember]
public string IrmPolicyDescription { get; set; }
[DataMember]
public string IrmPolicyTitle { get; set; }
[DataMember]
public string OwnerId { get; set; }
[DataMember]
public string PresenceProvider { get; set; }
[DataMember]
public string PresenceUserId { get; set; }
[DataMember]
public string PrivacyUrl { get; set; }
[DataMember]
public bool ProtectInClient { get; set; }
[DataMember]
public bool ReadOnly { get; set; }
[DataMember]
public bool RestrictedWebViewOnly { get; set; }
[DataMember]
public string SHA256 { get; set; }
[DataMember]
public string SignoutUrl { get; set; }
[DataMember]
public long Size { get; set; }
[DataMember]
public bool SupportsCoauth { get; set; }
[DataMember]
public bool SupportsCobalt { get; set; }
[DataMember]
public bool SupportsFolders { get; set; }
[DataMember]
public bool SupportsLocks { get; set; }
[DataMember]
public bool SupportsScenarioLinks { get; set; }
[DataMember]
public bool SupportsSecureStore { get; set; }
[DataMember]
public bool SupportsUpdate { get; set; }
[DataMember]
public string TenantId { get; set; }
[DataMember]
public string TermsOfUseUrl { get; set; }
[DataMember]
public string TimeZone { get; set; }
[DataMember]
public bool UserCanAttend { get; set; }
[DataMember]
public bool UserCanNotWriteRelative { get; set; }
[DataMember]
public bool UserCanPresent { get; set; }
[DataMember]
public bool UserCanWrite { get; set; }
[DataMember]
public string UserFriendlyName { get; set; }
[DataMember]
public string UserId { get; set; }
[DataMember]
public string Version { get; set; }
[DataMember]
public bool WebEditingDisabled { get; set; }
}
}
2014年6月13日更新:
使用CobaltaAPI可以编辑word文档,尽管我的实现还远远不够完美。让我们开始学习基本知识。FSSHTTP需要分解存储,SharePoint在数据库中实现,但在查看Cobalt Assembly后,我确定了在文件系统上创建分解文件的方法。。。以下是相关代码的片段,第一部分从c:\tmp\test.docx中获取word文档,并将其转换为c:\tmp\filestore和c:\tmp\wacupdate中的切碎blob
DisposalEscrow disposal = new DisposalEscrow("temp1");
CobaltFilePartitionConfig content = new CobaltFilePartitionConfig();
content.IsNewFile = false;
content.HostBlobStore = new FileSystemHostBlobStore("C:\\tmp\\filestore\\", "filestore", new FileSystemHostBlobStore.Config(), disposal, true, false);
content.cellSchemaIsGenericFda = true;
content.CellStorageConfig = new CellStorageConfig();
content.Schema = CobaltFilePartition.Schema.ShreddedCobalt;
content.PartitionId = FilePartitionId.Content;
CobaltFilePartitionConfig wacupdate = new CobaltFilePartitionConfig();
wacupdate.IsNewFile = false;
wacupdate.HostBlobStore = new FileSystemHostBlobStore("C:\\tmp\\wacstore\\", "wacstore", new FileSystemHostBlobStore.Config(), disposal, true, false);
wacupdate.cellSchemaIsGenericFda = false;
wacupdate.CellStorageConfig = new CellStorageConfig();
wacupdate.Schema = CobaltFilePartition.Schema.ShreddedCobalt;
wacupdate.PartitionId = FilePartitionId.WordWacUpdate;
Dictionary<FilePartitionId, CobaltFilePartitionConfig> pd = new Dictionary<FilePartitionId, CobaltFilePartitionConfig>();
pd.Add(FilePartitionId.Content, content);
pd.Add(FilePartitionId.WordWacUpdate, wacupdate);
// custom locking store is my implementation of hostlockingstore
CobaltFile cobaltFile = new CobaltFile(disposal, pd, new CustomHostLockingStore(), null);
var src = FileAtom.FromExisting("C:\\tmp\\Test.docx", disposal);
Cobalt.Metrics o1;
cobaltFile.GetCobaltFilePartition(FilePartitionId.Content).SetStream(RootId.Default.Value, src, out o1);
cobaltFile.GetCobaltFilePartition(FilePartitionId.Content).GetStream(RootId.Default.Value).Flush();
cobaltFile.CommitChanges();
海关锁店马上就要来了。我还没有把切碎的文件转换成word文档,但我想我知道怎么做
最终更新-完整的解决方案如下:
我在Windows server 2012的虚拟机上安装了Office Web Apps,可以点击。我想知道现在该如何测试这本指南是我需要的我相信非常感谢你。如果你能回答我的问题,我会把赏金奖励给你。同样的答案也适合我。如果你能帮忙的话,我们有一个小问题。一切似乎都正常,但无法加载文件。我在上面的问题中添加了我们的错误。在浏览器中,很抱歉我们遇到了问题。请试一试Again@windfly2006如果您想要编辑word文档,则需要实现FSSHTTP协议
}
else if (context.Request.HttpMethod.Equals(@"POST") && context.Request.Headers["X-WOPI-Override"].Equals("COBALT"))
{
Console.WriteLine(@"Got a cobalt request for the file");
var ms = new MemoryStream();
context.Request.InputStream.CopyTo(ms);
AtomFromByteArray atomRequest = new AtomFromByteArray(ms.ToArray());
RequestBatch requestBatch = new RequestBatch();
Object ctx;
ProtocolVersion protocolVersion;
requestBatch.DeserializeInputFromProtocol(atomRequest, out ctx, out protocolVersion);
cobaltFile.CobaltEndpoint.ExecuteRequestBatch(requestBatch);
cobaltFile.CommitChanges();
var response = requestBatch.SerializeOutputToProtocol(protocolVersion);
context.Response.Headers.Add("X-WOPI-MachineName", "test");
context.Response.Headers.Add("X-WOPI-CorellationID", context.Request.Headers["X-WOPI-CorrelationID"]);
context.Response.Headers.Add("request-id", context.Request.Headers["X-WOPI-CorrelationID"]);
context.Response.ContentType = @"application/octet-stream";
context.Response.ContentLength64 = response.Length;
response.CopyTo(context.Response.OutputStream);
context.Response.Close();
}