1

シンプルな 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;
}

アプリケーションが受け取った値を変換できないのはなぜですか? それは修正可能ですか、それとも他の解決策を見つける必要がありますか?

4

1 に答える 1

0

Data Service クライアントは、OData で説明されているスキーマからの EntityType マテリアライゼーション以外はサポートしていません (私にとっては MyWebService/Test.svc/$metadata です)。私が見つけた唯一の解決策は、System.Net の WebClient を使用することです。

WebClient wc = new WebClient();
wc.UseDefaultCredentials = true;

XDocument xdoc = XDocument.Parse(wc.DownloadString(new Uri(request)));
var res = xdoc.Root.Descendants( ((XNamespace)@"http://schemas.microsoft.com/ado/2007/08/dataservices") + 
                                            "element");

preresult = res.Select(xe => xe.Value).ToList();
于 2012-12-12T16:54:45.100 に答える