私はWCFが初めてです。
以下のサービスを書きましたが、正常に動作します。次に、IIS を構成し、ブラウザーhttp://localhost/WCF_Entity_SVC/ProductService.svcを介してサービスを実行しました。正常に動作します。ASP.Net Web ページを作成し、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 関数のパラメーターがサービスに渡され、エンティティ クエリへのリンクのどこかにエラーがあることを意味すると思います。
私が理解していないのは、サービスを直接実行してもエラーが発生しない理由です。データベースは私に結果を与える
さらにデバッグを行ったところ、open エラーの理由は次のとおりであることがわかりました。
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