我当前正在使用Visual Studio 2015,并正在建立一个网站。我曾尝试在3层体系结构中使用OperationContracts和ServiceContracts,但是,我只能做一些基本的事情(使用正常的string / int创建,检索,更新,删除)。
我想问一下 Web Service WCF ,是否可以从另一个数据库中检索 PDF文件?
这是我正在努力的情况:
以上情况是否可能?如果有可能,我可以参考/尝试使用任何准则/已知链接来实现此方案吗?
答案 0 :(得分:0)
Pdf被视为一个文件。 您可以使用byte []来传输文件。 下面是我的简单示例。
我的合同。
PUBLIC
我的服务。 AspNetCompatibilityRequirementsMode.Allowed用于启用HttpContext,否则它将为null。在这里,我直接将文件保存在服务器中,如果要将文件保存在sqlserver中,只需使用varbinary字段保存pdf文件的byte []。
[ServiceContract()]
public interface IFileUpload
{
[OperationContract]
void Upload(byte[] bys);
}
我的wcf服务的web.config。 bindingconfiguration ECMSBindingConfig用于启用上传大数据或该服务不允许太大的数据。 serviceHostingEnvironment的aspNetCompatibilityEnabled也应设置为true,否则HttpContext为null。
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class FileUploadService : IFileUpload
{
public void Upload(byte[] bys)
{
string filename = Guid.NewGuid().ToString()+".pdf";
File.WriteAllBytes(HttpContext.Current.Request.MapPath("/upload/") + filename, bys);
}
}
我的客户。用户网络表单作为示例。
<service name="Service.CalculatorService" >
<endpoint binding="basicHttpBinding" bindingConfiguration="ECMSBindingConfig" contract="ServiceInterface.ICalculatorService"></endpoint>
</service>
<bindings>
<basicHttpBinding>
<binding name="ECMSBindingConfig" allowCookies="false" maxBufferPoolSize="2147483647" maxBufferSize="2147483647"
maxReceivedMessageSize="2147483647" bypassProxyOnLocal="true" >
<readerQuotas maxArrayLength="2147483647" maxNameTableCharCount="2147483647"
maxStringContentLength="2147483647" maxDepth="2147483647"
maxBytesPerRead="2147483647" />
<security mode="None" />
</binding>
</basicHttpBinding>
</bindings>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"
/>
后面有代码。在这里我使用channelFacotory,它类似于Visual Studio生成的客户端
<form id="form1" runat="server">
<asp:FileUpload ID="FileUpload1" runat="server" />
<asp:Button ID="Button1" runat="server" Text="upload" OnClick="Button1_Click" />
</form>
客户端的Web.config。
protected void Button1_Click(object sender, EventArgs e)
{
HttpPostedFile file = FileUpload1.PostedFile;
using (ChannelFactory<IFileUpload> uploadPdf = new ChannelFactory<IFileUpload>("upload"))
{
IFileUpload fileUpload = uploadPdf.CreateChannel();
byte[] bys = new byte[file.InputStream.Length];
file.InputStream.Read(bys, 0, bys.Length);
fileUpload.Upload(bys);
}
}
我假设用户上传pdf,如果您要上传其他文件,则可以添加文件扩展名作为服务的参数。其他操作应该类似。