WCF服务中的表达式编码器4



我正在尝试编写一个WCF服务,该服务将在iis8中运行,并将使用Expression Encoder SDK打开视频文件,然后将其编码为WMV。下面的代码在我之前编写的桌面应用程序中运行良好。

Job job = new Job();
job.ApplyPreset(Preset.FromFile(HttpRuntime.AppDomainAppPath + "Profiles\" + profile + ".xml"));
job.CreateSubfolder = false;
job.SaveJobFileToOutputDirectory = false;
job.OutputDirectory = Path.GetDirectoryName(input);
MediaItem item;
item = new MediaItem(input);
item.OutputFileName = "{Original file name}.wmv";
job.MediaItems.Add(item);
job.EncodeProgress += new EventHandler<EncodeProgressEventArgs>(job_EncodeProgress);
job.EncodeCompleted += new EventHandler<EncodeCompletedEventArgs>(job_EncodeCompleted);
job.Encode();

但是当我尝试在IIS上运行的WCF服务中运行此代码时,我得到以下错误

The type initializer for 'Microsoft.Expression.Encoder.SkuManager' threw an exception.
at Microsoft.Expression.Encoder.SkuManager.IsFeaturedSupported(Feature feature)
at MS.Internal.Expression.Encoder.FastProperties.FastPropertyCreate.ShouldAddProp(IFastProperty property, PropertyType propType)
at MS.Internal.Expression.Encoder.FastProperties.FastPropertyCreate.CreatePropertiesArray[T](Type classType, PropertyType propType)
at MS.Internal.Expression.Encoder.FastProperties.FastPropertyCreate.GetProperties[T](PropertyType propType)
at MS.Internal.Expression.Encoder.Persistence.JobPersistence.GetJobFilePropertiesCore[T](JobPropertiesMode mode)
at MS.Internal.Expression.Encoder.Persistence.JobPersistence.GetJobFileProperties[T](JobPropertiesMode mode)
at Microsoft.Expression.Encoder.JobBase.CreateDefaultValues(JobBase job)
at Microsoft.Expression.Encoder.JobBase..ctor()
at Microsoft.Expression.Encoder.Job..ctor()

我可以在服务器上的常规桌面应用程序中运行这段代码,但不能在同一台机器上运行的WCF服务中运行。

原来是IIS的权限问题。

为了让任何程序使用Expression Encoder SDK,它需要在一个可以访问安装在机器上的Expression Encoder程序的身份下运行。

因此,在IIS中,WCF服务运行的"ApplicationPoolIdentity"身份没有权限启动由"Administrator"帐户安装在机器上的表达式编码器程序。

要解决这个问题,你可以做以下两件事之一:

  1. 当你安装表达式编码器允许"所有用户"能够启动它

  2. 当你在IIS上安装WCF服务时,确保它在一个可以启动Expression Encoder的应用程序池中运行

我在一个iis8网站(没有托管任何wcf服务)也有同样的问题,是的,我也发现IIS需要在可以执行表达式编码器的权限下运行。但是有一天它突然停止工作,并开始抛出同样的错误:

"The type initializer for 'Microsoft.Expression.Encoder.SkuManager' threw an exception."

尽管applool的身份很好。我紧张了一天左右,然后意识到,不知何故,VS复制到本地bin目录的二进制文件不想在IIS中运行。不知何故损坏或dll与表达式的安装不匹配??我不得不删除bin目录的内容,然后VS替换了它们,它工作了。将这些引用的CopyLocal设置为false不起作用(可以想象,只使用from gac可能会更好)。

最新更新