C# 为什么数据服务不将值返回给应用程序,而是将其返回给浏览器?如何修复它?
只需一个简单的OData web服务:C# 为什么数据服务不将值返回给应用程序,而是将其返回给浏览器?如何修复它?,c#,web-services,odata,C#,Web Services,Odata,只需一个简单的OData web服务: public class TestService : DataService<ASUTBEntities> { public static void InitializeService(DataServiceConfiguration config) { config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
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=“一些字符串”。它返回如下内容:
<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>
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、计数为0的列表。我是这样做的:
<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>
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;
}
为什么应用程序不能转换接收到的值?它是可修复的,还是我必须找到其他解决方案?数据服务客户端只支持模式中的EntityType实体化,在OData中有描述。对我来说,它是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();