我的WCF服务使用wsHttpBinding,当客户端使用默认选项对服务进行gerenated时,客户端可以正常工作,如下所示:
RServiceClient R = new RServiceClient();
Run Code Online (Sandbox Code Playgroud)
但是,在某些时候,我需要能够指定服务的位置,可能是通过更改端点地址,如下所示:
RServiceClient R = new RServiceClient();
R.Endpoint.Address = new EndpointAddress(new Uri "http://xxx.xxxx.xxx:80/RServer/RService.svc"));
Run Code Online (Sandbox Code Playgroud)
但是,当我确实指定了确切的端点时,我得到一个SecurityNegotiationException:System.ServiceModel.Security.SecurityNegotiationException未处理Message ="调用者未被服务验证." 来源= "mscorlib程序" ....
WCF服务在IIS上运行,并在IIS管理员下启用了匿名访问.此外,当客户端从与管理员帐户下的服务相同的计算机运行时,会发生此错误 - 我还没有到达通过网络运行它的可怕部分!
有任何想法吗?
我有一个由父(执行)程序集引用的dll.在父程序集的app.config的ApplicationSettings部分中,我有一些可以以正常intellisense方式访问的设置(例如,Properties.Settings.Default.SMTPServer).
如何从引用的dll访问这些设置?我显然不能使用intellisense,因为它们不在同一个程序集中!
继续从这里提出一个问题让我思考....
当应用程序遇到未处理的异常时,是否有可能将此异常对象序列化并发送到具有db后端的Web服务.然后,使用实用程序甚至在Visual Studio中,异常对象可以从db加载并检查??
这有可能吗?我想第一个问题是你是否可以序列化异常对象.
在过去,我总是离开并为特定项目调用我的命名空间与项目(和原则类)相同,例如:
namespace KeepAlive
{
public partial class KeepAlive : ServiceBase
{...
Run Code Online (Sandbox Code Playgroud)
然后在其他项目中,每当我调用该类时,它始终是:
KeepAlive.KeepAlive()...
Run Code Online (Sandbox Code Playgroud)
我现在开始认为这可能不是一个好主意,但我有点难以实际调用我的命名空间.其他人做什么?您是否只为所有项目设置了一个命名空间?
在我的数据库中,我有一个Vehicle带主键的表.我正在使用创建一个新Vehicle对象
new Vehicle();
Run Code Online (Sandbox Code Playgroud)
并适当更新车辆的属性.
当我尝试做一个
genesisContext.Vehicles.AddObject(vehicle);
Run Code Online (Sandbox Code Playgroud)
第一次成功更新表并且主键为0.在随后的所有情况下,我都会收到错误消息,指出密钥不是唯一的
违反PRIMARY KEY约束'VEHICLES_PK'.无法在对象'dbo.Vehicles'中插入重复键.\ r \n语句已终止.
(可能是因为EF设置的主键仍为0)
我的理解是,EF智能地计算出主键,为什么会发生这种情况?
我试图在我的DomainService中创建一个方法来返回一个字符串列表.我这样做的原因是因为我不想返回整个信息实体.我可以创建一个返回单个字符串的方法,如下所示:
public string GetDestinations()
{
return "Hello world";
}
Run Code Online (Sandbox Code Playgroud)
这可以通过InvokeOperation<string>电话从客户端正常工作.但是,当我将DomainService方法转换为Ienumerable时,如下所示;
public IEnumerable<string> GetDestinations()
{
List<String> h = new List<string>();
h.Add("HELLO");
h.Add("WORLD");
return h;
}
Run Code Online (Sandbox Code Playgroud)
然后显然使用InvokeOperation<IEnumerable<string>>调用我得到编译器错误:
类型'String'不是有效的实体类型.实体类型不能是原始类型或简单类型,如字符串或Guid.
咦?鉴于我可以返回单个字符串,这没有意义.如何从DomainService返回字符串列表?
我有一个静态类 (DataFormSubject),它包含一个通用 List 对象,如下所示:
private static List<DataForm> dataForms = new List<DataForm>();
Run Code Online (Sandbox Code Playgroud)
当列表更新时,需要告知依赖此列表的其他类,因此我创建了一个自定义事件,以及在添加或删除项目时可以触发的关联方法,如下所示:
public delegate void DataFormsUpdatedHandler(object sender);
public static event DataFormsUpdatedHandler DataFormsUpdatedEvent;
public static void AddDataForm(DataForm df)
{
dataForms.Add(df);
if (DataFormsUpdatedEvent != null)
DataFormsUpdatedEvent(df);
}
public static void RemoveDataForm(DataForm df)
{
dataForms.Remove(df);
if (DataFormsUpdatedEvent != null)
DataFormsUpdatedEvent(df);
}
Run Code Online (Sandbox Code Playgroud)
该列表可通过属性从静态类获取,如下所示:
public static List<DataForm> DataForms
{
get { return dataForms; }
//set { dataForms = value; }
}
Run Code Online (Sandbox Code Playgroud)
但这里的问题是,客户端现在可以通过访问属性并在类上直接添加或删除来绕过更新事件!例如
DataFormSubject.DataForms.Add(new DataForm);
Run Code Online (Sandbox Code Playgroud)
我怎样才能防止这种情况,或者有更好的方法来实现我想要的?理想情况下,我想要的是观察者可以订阅的 List 类上的更新事件!
如果我有一个专门在引用类型变量(例如数据表)上操作并修改它的方法,是否需要从方法中返回该变量?
例如,以下方法遍历数据表并修剪其中的所有值,然后将数据表返回给调用者:
private DataTable TrimAllDataInDataTable(DataTable dt)
{
foreach (DataRow row in dt.Rows)
{
foreach (DataColumn dc in dt.Columns)
{
row[dc] = row[dc].ToString().Trim();
}
}
return dt;
}
Run Code Online (Sandbox Code Playgroud)
如果此方法返回void会更好吗?返回它(?)似乎没有意义,但你认为如果它在操作之后返回对象(就像现在那样)会更好吗?
我正在使用PredicateBuilder,这意味着我正在使用AsExpandable扩展方法.问题是我无法再跟踪我的SQL查询,因为当我尝试将查询强制转换为ObjectQuery时会抛出以下错误,以便我可以对它执行ObjectQuery.ToTraceString()调用...
无法将类型为"LinqKit.ExpandableQuery`1 [Genesis.Person]"的对象强制转换为"System.Data.Objects.ObjectQuery".
有任何想法吗?
我正在使用实体框架,并且有一个查看一组People的循环,并使用foreach循环创建一个查询每个人的地址.在创建每个地址查询时,它会添加到树视图的节点中,以后可以使用它(填充子节点):
IQueryable<Person> pQuery = (IQueryable<Person>)myContext.People; //get a list of people
//go through and get the set of addresses for each person
foreach (var p in pQuery)
{
var addressQuery = from a in myContext.Addresses
from al in a.Address_Links
where al.P_ID == p.P_ID
orderby a.A_POST_CODE
select a;
//add the query to a TreeView node (use the tag to store it)
TreeNode newNode = new TreeNode();
newNode.Tag = addressQuery;
}
Run Code Online (Sandbox Code Playgroud)
现在,我在运行应用程序时发现的问题是所有查询都是最后创建的查询,即循环的最后一次迭代.就像在循环的第一次迭代中创建addressQuery,然后在每个后续查询中覆盖它.结果就是它就像treenodes中的所有地址查询都是对最后一个查询的引用(?)
进一步研究我可以通过使用静态类生成地址查询并将其传递到每个TreeNode来解决问题,如下所示:
public static class Queries
{
public static IQueryable<Address> AddressesForPerson(GenesisEntities myContext, …Run Code Online (Sandbox Code Playgroud) c# ×3
.net ×2
linq ×2
byref ×1
exception ×1
list ×1
namespaces ×1
settings ×1
silverlight ×1
sql-server ×1
wcf ×1
web-services ×1