我是 WCF 的新手。
我在下面编写了以下服务,运行良好。然后我配置了 IIS,并通过浏览器http://localhost/WCF_Entity_SVC/ProductService.svc运行服务,运行良好。我创建了一个 ASP.Net 网页并使用 url 添加了一个服务引用。当我运行 ASP 页面时,我收到一个内部错误。任何帮助表示赞赏。
public class ProductService : IProductService
{
public Product GetProduct(int id)
{
NorthwindEntities context = new NorthwindEntities();
var productEntity = (from p
in context.ProductEntities
where p.ProductID == id
select p).FirstOrDefault();
if (productEntity != null)
return TranslateProductEntityToProduct(productEntity);
else
throw new Exception("Invalid product id");
}
private Product TranslateProductEntityToProduct(
ProductEntity productEntity)
{
Product product = new Product();
product.ProductID = productEntity.ProductID;
product.ProductName = productEntity.ProductName;
product.QuantityPerUnit = productEntity.QuantityPerUnit;
product.UnitPrice = (decimal)productEntity.UnitPrice;
product.Discontinued = productEntity.Discontinued;
return product;
}
}
ASP 代码
public partial class _Default : System.Web.UI.Page
{
myService.ProductServiceClient objService = new ProductServiceClient();
protected void Page_Load(object sender, EventArgs e)
{
var results = objService.GetProduct(45); //debug shows internal error
dgResult.DataSource = results;
dgResult.DataBind();
}
}
将调试添加到 webconfig 会显示以下错误:
The underlying provider failed on Open.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.ServiceModel.FaultException`1[[System.ServiceModel.ExceptionDetail, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]: The underlying provider failed on Open.
Source Error:
Line 159:
Line 160: public ASPWFC.myService.Product GetProduct(int id) {
Line 161: return base.Channel.GetProduct(id);
Line 162: }
Line 163: }
Source File: D:\My Documents\Visual Studio 2010\Projects\wcf\WCF_Entity\ASPWFC\Service References\myService\Reference.cs Line: 161
Stack Trace:
[FaultException`1: The underlying provider failed on Open.]
System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) +9464367
System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) +345
ASPWFC.myService.IProductService.GetProduct(Int32 id) +0
ASPWFC.myService.ProductServiceClient.GetProduct(Int32 id) in D:\My Documents\Visual Studio 2010\Projects\wcf\WCF_Entity\ASPWFC\Service References\myService\Reference.cs:161
ASPWFC._Default.Page_Load(Object sender, EventArgs e) in D:\My Documents\Visual Studio 2010\Projects\wcf\WCF_Entity\ASPWFC\Default.aspx.cs:23
System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +37
System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +95
System.Web.UI.Control.OnLoad(EventArgs e) +145
System.Web.UI.Control.LoadRecursive() +134
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3412
出于调试目的,我向服务添加了一个名为 Getparams(int id) 的函数,该函数所做的只是返回 id。我在 ASp 页面中调用了 Getparams 函数,并取回了传递的参数。我认为这意味着 GetProduct 函数中的参数正在传递给服务,并且在实体查询的链接中的某处是错误。
我不明白的是为什么当我直接运行服务时,没有错误。数据库给了我一个结果
我做了一些更多的调试,我发现打开错误的原因是:
sqlError: IIS AppPool\ASP.Net4 登录失败
我该如何解决这个问题,我的 sqlserver 通过 Windows 身份验证运行。
我在 msdn 中找到了一个修复安全问题的脚本,并且该代码可以正常工作
CREATE LOGIN [IIS APPPOOL\ASP.NET v4.0]
FROM WINDOWS WITH DEFAULT_DATABASE=[Northwind],
DEFAULT_LANGUAGE=[us_english]
GO
CREATE USER [NWUser]
FOR LOGIN [IIS APPPOOL\ASP.NET v4.0]
GO
EXEC sp_addrolemember 'db_datareader', 'NWUser'
GO