总结
如何在Azure上的IIS中托管时如何在localhost上访问WCF服务?Azure不会将localhost或127.0.0.1绑定到我的网站.
详细信息
我在Azure上托管了一个ASP.Net应用程序.我添加了一个.svc和一些我想通过WCF使用的工作流程.为了简单起见,我的网络应用程序只是在localhost上调用服务,所以我在web.config中有这样的端点;
<client>
<endpoint address="http://localhost:8080/Router.svc/Case" binding="basicHttpBinding" contract="NewOrbit.ExVerifier.Model.Workflow.Case.ICaseWorkflow" name="Case" />
<endpoint address="http://localhost:8080/Workflow/Case/Case_default1.xamlx" binding="basicHttpBinding" contract="*" name="Case_default1" />
</client>
Run Code Online (Sandbox Code Playgroud)
这在我的本地机器上工作得很好.问题是,当我将此发布到Azure时,IIS中的网站不会绑定到localhost,而是绑定始终是服务器的实际IP地址.它最终在applicationHost.config中看起来像这样:
<bindings>
<binding protocol="http" bindingInformation="10.61.90.44:80:" />
<binding protocol="https" bindingInformation="10.61.90.44:443:" />
<binding protocol="http" bindingInformation="10.61.90.44:8081:" />
</bindings>
Run Code Online (Sandbox Code Playgroud)
因此,只要我的Web应用程序尝试在localhost(或127.0.0.1)上调用该服务,它就会立即失败.不用说,如果我转到服务器并更改绑定,那么一切都很好.
我发现很奇怪的是,有很多例子,人们在Azure上的localhost上访问WCF服务,所以我无法弄清楚为什么会这样.我已经将osFamily设置为2并且为了调试这个我启用了Web发布和远程桌面访问,我认为理论上可能会搞砸了.
我已经看过了什么
我已经创建了编码活动,现在我想对它进行单元测试,但我不知道如何.任何例子将不胜感激.
我的简单例子如下.
public sealed class ParameterActivity : CodeActivity
{
public InArgument<int> Argument1 { get; set; }
public InArgument<int> Argument2 { get; set; }
public OutArgument<int> Result { get; set; }
protected override void Execute(CodeActivityContext context)
{
var a = context.GetValue(Argument1);
var b = context.GetValue(Argument2);
context.SetValue(Result, a + b);
}
}
Run Code Online (Sandbox Code Playgroud) 在我们的WF4工作流服务中,我们尽量保持健壮.我们做的一件事就是在HandleError和ProvideFault(IErrorhandler)中记录错误.文档清楚地说明HandleError是进行日志记录的正确位置,但我发现有些奇怪的事情发生了:
我看到一些错误只触发ProvideFault,但从来没有HandleError,一个例子是:
System.NullReferenceException:未将对象引用设置为对象的实例.在System.ServiceModel.Activities.Dispatcher.DurableInstanceManager.GetInstanceAsyncResult.GetInstance()at System.ServiceModel.Activities.Dispatcher.DurableInstanceManager.GetInstanceAsyncResult..ctor
还有一些错误只触发HandleError,但从不提供ProvideFault,一个例子是:
System.ServiceModel.CommunicationException:从管道读取错误:管道已结束.(109,0x6d).在System.ServiceModel.Channels.PipeConnection.Read(Byte []缓冲区,Int32偏移量,Int32大小,TimeSpan超时)处于System.ServiceModel.Channels.SessionConnectionReader.Receive(TimeSpan超时)
最后有错误触发两者,首先是ProvideFault,然后是HandleError(在后台线程上)
如果可能的话,我也想记录相应的传入消息.我使用OperationContext.Current.RequestContext.RequestMessage.ToString()执行此操作这通常只适用于ProvideFault,在HandleError中我们不再有RequestContext
所以我的结论是,要记录所有错误,我必须登录这两种方法.但由于3 ..这导致了大量重复的日志条目.
我目前的解决方法是"记住"来自ProvideFault的最后一个记录的异常,如果相同的异常进入HandleError则忽略它.看起来不是很干净.
有没有人能够更好,更可靠地记录WF服务中可能发生的所有错误?
请不要指向使用HandleError或ProvideFault中的IErrorHandler在WCF中记录异常?因为这没有提供任何帮助.
我创建了一个工作流程,我通过WorkflowInstance.Run()运行它.这个工作流程有很多书签,我希望能够查询哪个书签负责当前的空闲状态.
我怎么能这样做?
谢谢
我不清楚何时以及如何在WF 4.0中的自定义活动/自定义活动工厂/自定义设计器中进行验证.
我的活动中唯一似乎提供验证错误支持的地方是在CacheMetadata方法中(我相信在设计过程中会多次调用它).这是我应该进行验证的地方吗?ActivityDesigner中是否支持验证?
因此,作为我的工作流程的一部分,我需要调用外部WCF服务来检索一些对象.问题是我无法看到如何模拟将由send活动调用的WCF服务.有谁知道我怎么做到这一点?
谢谢,约翰
我打算使用WF 4.0在ASP.NET 4.0中构建自定义Web应用程序,用户希望能够自己修改工作流程,为此我们将使用用户可以使用的WPF客户端,我们将进行工作流重新托管,有很多博客和指导可供选择.
但我不确定如何满足用户想要查看/跟踪工作流的可视化表示(图表/图像)的一个要求,描述哪些阶段结束,当前阶段是什么等.这需要在一个网页.可能与描绘状态的图标相同的工作流程.这类似于SharePoint 2010中Visio工作流可用的视觉效果.甚至AgilePoint工作流也提供了这样的视图.
类似的问题在这里,但它的WinForms/WPF我想.我需要这个用于ASP.NET.
有任何想法吗?
asp.net .net-4.0 asp.net-4.0 workflow-foundation-4 agilepoint
我正在构建一个将在Azure上运行工作流的应用程序.
我已经看到构建演示文稿 使用Workflow构建应用程序和Azure - BUILD 2011,它讨论了当前的功能,以及未来可能实现的功能.讨论的一件事是称为"Azure工作流服务",据我所知,计划在2012年进行预览.但是,我还没有找到更多有关它的信息.
此外,Windows Azure AppFabric中还有一个早期演示文稿Workflow,其中讨论了有关Azure中工作流的更多信息,重点介绍了Windows Azure AppFabric CTP.本演示文稿中讨论了许多很酷的功能,但我不确定这些功能是否可用,如果没有,可用时.
所以有两个问题:
如果我今天需要构建应用程序,那么在Azure上实现工作流的建议方法是什么?
如果应用程序不需要在一年之后完成,那么在Azure上实现工作流的建议方法是什么?
除了基于WPF的重新设计的设计器之外,还有基于HTML/HTML5的Windows Workflow Foundation工作流设计器吗?
问候普拉萨德
我试图在Windows工作流基础4.5中构建一个简单的请假申请,它会在工作流尝试完成而不等待approveRequest活动时抛出以下异常.
具有相同ServiceContractName和OperationName'ApplyLeave'的两个SendParameters对象具有不同的参数名称.
你能告诉我缺少什么吗?
using System;
using System.ServiceModel.Activities;
using System.Activities;
using System.ServiceModel;
using System.Activities.Statements;
namespace DemoWF
{
public class _25_LeaveRequest
{
public WorkflowService GetInstance()
{
WorkflowService service;
Variable<int> empID = new Variable<int> { Name = "empID" };
Variable<int> requestID = new Variable<int> { Name = "requestID" };
Receive receiveLeaveRequest = new Receive
{
ServiceContractName = "ILeaveRequestService",
OperationName = "ApplyLeave",
CanCreateInstance = true,
Content = new ReceiveParametersContent
{
Parameters ={
{"empID",new OutArgument<int>(empID)}
}
}
};
SendReply replyLeaveRequestID = new SendReply
{
Request …Run Code Online (Sandbox Code Playgroud) workflow ×3
azure ×2
c# ×2
wcf ×2
.net-4.0 ×1
agilepoint ×1
asp.net ×1
asp.net-4.0 ×1
designer ×1
mocking ×1
unit-testing ×1
validation ×1