シンプルな OData Web サービスを用意するだけです。
public class TestService : DataService<ASUTBEntities>
{
public static void InitializeService(DataServiceConfiguration config)
{
config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
config.SetEntitySetAccessRule("*", EntitySetRights.AllRead
| EntitySetRights.WriteMerge
| EntitySetRights.WriteReplace);
config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
}
[WebGet]
public List<Search_Result1> FindCarOwner(string searchString)
{
List<Search_Result1> result = new List<Search_Result1>();
result.AddRange(CurrentDataSource.FindContragents(searchString).ToList());
return result;
}
}
Search_Result1 - EDMX ファイルの Sql Server のストアド プロシージャから自動生成される複合型です。ブラウザに次のようなものを入力すると: hxxp://MyWebService/Test.svc/FindCarOwner?searchString='SomeString' . 次のようなものが返されます。
<FindCarOwner xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices">
<element xmlns:p2="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" p2:type="ASUTBModel.Search_Result1">
<Name>
Name of the company
</Name>
<ID p2:type="Edm.Int32">538175</ID>
</element>
... and 3 elements more (total 4 elements)
</FindCarOwner>
しかし、アプリケーションからこの関数を呼び出そうとすると、Capacity=4 と Count=0 の List が返されます。私はこのようにします:
ASUTBOData.ASUTBEntities context = new ASUTBOData.ASUTBEntities(new Uri(servicePath));
context.Credentials = System.Net.CredentialCache.DefaultCredentials;
context.MergeOption = MergeOption.NoTracking;
List<Search_Result1> preresult;
try
{
preresult = context.Execute<Search_Result1>(new Uri("hxxp://MyWebService/Test.svc/FindCarOwner?searchString='SomeString'")).ToList();
}
catch (Exception e)
{
return null;
}
アプリケーションが受け取った値を変換できないのはなぜですか? それは修正可能ですか、それとも他の解決策を見つける必要がありますか?